diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 111f45a3aac36a5f2beeac47688a630de62d1f50..84c7810e2a6f3edc0709effd1980f75e01efae78 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -139,11 +139,13 @@ class Categorie { $this->error=$langs->trans("ImpossibleAddCat"); $this->error.=" : ".$langs->trans("CategoryExistsAtSameLevel"); + dol_syslog($this->error, LOG_ERR); return -4; } $this->db->begin(); + dol_syslog(get_class($this).'::create sql='.$sql); $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie (label, description,"; if ($conf->global->CATEGORY_ASSIGNED_TO_A_CUSTOMER) { @@ -163,7 +165,8 @@ class Categorie //$sql.= ",".$this->parentId; $sql.= ")"; - $res = $this->db->query($sql); + dol_syslog(get_class($this).'::create sql='.$sql); + $res = $this->db->query($sql); if ($res) { $id = $this->db->last_insert_id(MAIN_DB_PREFIX."categorie"); @@ -867,6 +870,8 @@ class Categorie /** * Check if no category with same label already exists for this cat's parent or root and for this cat's type + * TODO For the moment, the unique key is on the type, label, entity. We must remove table llx_categorie_association + * to replace with a field fk_parent. This will allow to extend unique key with the level. * * @return boolean 1 if already exist, 0 otherwise, -1 if error */ @@ -887,17 +892,14 @@ class Categorie } else // mother_id undefined (so it's root) { - /* We have to select any rowid from llx_categorie which which category's type and label - * are equals to those of the calling category, AND which doesn't exist in categorie association - * as children (rowid != fk_categorie_fille) + /* We have to select any rowid from llx_categorie that is not at root level */ $sql = "SELECT c.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."categorie as c "; - $sql.= " JOIN ".MAIN_DB_PREFIX."categorie_association as ca"; - $sql.= " ON c.rowid!=ca.fk_categorie_fille"; $sql.= " WHERE c.type=".$this->type; $sql.= " AND c.label='".$this->db->escape($this->label)."'"; $sql.= " AND c.entity IN (".getEntity('category',1).")"; + $sql.= " AND c.rowid NOT IN (SELECT ca.fk_categorie_fille FROM ".MAIN_DB_PREFIX."categorie_association as ca)"; } dol_syslog(get_class($this)."::already_exists sql=".$sql, LOG_DEBUG); $resql = $this->db->query($sql); diff --git a/test/phpunit/CategorieTest.php b/test/phpunit/CategorieTest.php index fe9ab89008a32fac5ddbda648e5cd88e4bb28c3d..8fa6c478e1e75e5965307ac6c01436ea3abb8407 100755 --- a/test/phpunit/CategorieTest.php +++ b/test/phpunit/CategorieTest.php @@ -131,7 +131,14 @@ class CategorieTest extends PHPUnit_Framework_TestCase // We create a category $localobject=new Categorie($this->savdb); $localobject->initAsSpecimen(); - $resultFirstCreate=$localobject->create($user); + + // Check it does not exist (return 0) + $resultCheck=$localobject->already_exists(); + print __METHOD__." resultCheck=".$resultCheck."\n"; + $this->assertEquals(0, $resultCheck); + + // Create + $resultFirstCreate=$localobject->create($user); print __METHOD__." resultFirstCreate=".$resultFirstCreate."\n"; $this->assertGreaterThan(0, $resultFirstCreate); @@ -139,6 +146,7 @@ class CategorieTest extends PHPUnit_Framework_TestCase $localobject2=new Categorie($this->savdb); $localobject2->initAsSpecimen(); + // Check it does exist (return 1) $resultCheck=$localobject2->already_exists(); print __METHOD__." resultCheck=".$resultCheck."\n"; $this->assertGreaterThan(0, $resultCheck);