diff --git a/htdocs/core/menus/standard/auguria_menu.php b/htdocs/core/menus/standard/auguria_menu.php index 5f585794d39..ac84a0713f3 100644 --- a/htdocs/core/menus/standard/auguria_menu.php +++ b/htdocs/core/menus/standard/auguria_menu.php @@ -110,12 +110,12 @@ class MenuManager // Modules system tools // TODO Find a way to add parent menu only if child menu exists. For the moment, no other method than hard coded methods. - if (! empty($conf->product->enabled) || ! empty($conf->service->enabled) || ! empty($conf->barcode->enabled) // TODO We should enabled module system tools entry without hardcoded test on some modules + if (! empty($conf->product->enabled) || ! empty($conf->service->enabled) || ! empty($conf->barcode->enabled) // TODO We should enabled module system tools entry without hardcoded test, but when at least one modules bringing such entries are on || ! empty($conf->global->MAIN_MENU_ENABLE_MODULETOOLS)) { if (empty($user->societe_id)) { - if ($leftmenu=="modulesadmintools" && $user->admin) + if ((! empty($conf->product->enabled) || ! empty($conf->service->enabled)) && ($leftmenu=="modulesadmintools" && $user->admin)) { $langs->load("products"); $array_menu_product=array( @@ -133,24 +133,6 @@ class MenuManager ); array_unshift($tabMenu,$array_menu_product); // add at beginning of array } - if ($leftmenu=="modulesadmintools" && $user->admin) - { - $langs->load("admin"); - $array_menu_product=array( - 'url'=>"/barcode/codeinit.php?mainmenu=home&leftmenu=modulesadmintools", - 'titre'=>$langs->trans("MassBarcodeInit"), - 'enabled'=>($user->admin?true:false), - 'perms'=>($user->admin?true:false), - 'fk_mainmenu'=>'home', - 'fk_leftmenu'=>'modulesadmintools', - 'fk_menu'=>-1, - 'mainmenu'=>'home', - 'leftmenu'=>'modulesadmintools_massbarcode', - 'type'=>'left', - 'position'=>21 - ); - array_unshift($tabMenu,$array_menu_product); // add at beginning of array - } // Main menu title $array_menu_product=array( 'url'=>"/admin/tools/index.php?mainmenu=home&leftmenu=modulesadmintools", diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 5a2ae201a0f..6c7e64d118a 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -539,7 +539,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu } // Modules system tools - if (! empty($conf->product->enabled) || ! empty($conf->service->enabled) || ! empty($conf->barcode->enabled) // TODO We should enabled module system tools entry without hardcoded test on some modules + if (! empty($conf->product->enabled) || ! empty($conf->service->enabled) || ! empty($conf->barcode->enabled) // TODO We should enabled module system tools entry without hardcoded test, but when at least one modules bringing such entries are on || ! empty($conf->global->MAIN_MENU_ENABLE_MODULETOOLS)) // Some external modules may need to force to have this entry on. { if (empty($user->societe_id)) diff --git a/htdocs/core/modules/barcode/mod_barcode_product_standard.php b/htdocs/core/modules/barcode/mod_barcode_product_standard.php index d20c7502f4a..c7a48c80b2f 100644 --- a/htdocs/core/modules/barcode/mod_barcode_product_standard.php +++ b/htdocs/core/modules/barcode/mod_barcode_product_standard.php @@ -190,15 +190,29 @@ class mod_barcode_product_standard extends ModeleNumRefBarCode } else { - // Get Mask value - $mask = empty($conf->global->BARCODE_STANDARD_PRODUCT_MASK)?'':$conf->global->BARCODE_STANDARD_PRODUCT_MASK; - if (! $mask) + if ($this->verif_syntax($code) >= 0) { - $this->error='NotConfigured'; - return ''; + $is_dispo = $this->verif_dispo($db, $code, $product); + if ($is_dispo <> 0) + { + $result=-3; + } + else + { + $result=0; + } + } + else + { + if (dol_strlen($code) == 0) + { + $result=-2; + } + else + { + $result=-1; + } } - - $result=check_value($mask,$code); } dol_syslog(get_class($this)."::verif type=".$type." result=".$result); @@ -216,8 +230,8 @@ class mod_barcode_product_standard extends ModeleNumRefBarCode */ function verif_dispo($db, $code, $product) { - $sql = "SELECT ref FROM ".MAIN_DB_PREFIX."product"; - $sql.= " WHERE ref = '".$code."'"; + $sql = "SELECT barcode FROM ".MAIN_DB_PREFIX."product"; + $sql.= " WHERE barcode = '".$code."'"; if ($product->id > 0) $sql.= " AND rowid <> ".$product->id; $resql=$db->query($sql); @@ -239,6 +253,31 @@ class mod_barcode_product_standard extends ModeleNumRefBarCode } + /** + * Renvoi si un code respecte la syntaxe + * + * @param string $code Code a verifier + * @return int 0 if OK, <0 if KO + */ + function verif_syntax($code) + { + global $conf; + + $res = 0; + + // Get Mask value + $mask = empty($conf->global->BARCODE_STANDARD_PRODUCT_MASK)?'':$conf->global->BARCODE_STANDARD_PRODUCT_MASK; + if (! $mask) + { + $this->error='NotConfigured'; + return ''; + } + + $result=check_value($mask,$code); + + return $result; + } + } ?> diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 5dd292aa10b..fa0b87cc506 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -26,8 +26,11 @@ ErrorFromToAccountsMustDiffers=Source and targets bank accounts must be differen ErrorBadThirdPartyName=Bad value for third party name ErrorProdIdIsMandatory=The %s is mandatory ErrorBadCustomerCodeSyntax=Bad syntax for customer code +ErrorBadBarCodeSyntax=Bad syntax for bar code ErrorCustomerCodeRequired=Customer code required +ErrorBarCodeRequired=Bar code required ErrorCustomerCodeAlreadyUsed=Customer code already used +ErrorBarCodeAlreadyUsed=Bar code already used ErrorPrefixRequired=Prefix required ErrorUrlNotValid=The website address is incorrect ErrorBadSupplierCodeSyntax=Bad syntax for supplier code diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index f5070cf3eda..42209bbcca1 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2013 Laurent Destailleur + * Copyright (C) 2004-2014 Laurent Destailleur * Copyright (C) 2005-2013 Regis Houssin * Copyright (C) 2006 Andre Cianfarani * Copyright (C) 2007-2011 Jean Heimburger @@ -202,7 +202,7 @@ class Product extends CommonObject * * @param User $user User making insert * @param int $notrigger Disable triggers - * @return int Id of product/service if OK or number of error < 0 + * @return int Id of product/service if OK, < 0 if KO */ function create($user,$notrigger=0) { @@ -300,141 +300,230 @@ class Product extends CommonObject // For automatic creation during create action (not used by Dolibarr GUI, can be used by scripts) if ($this->barcode == -1) $this->get_barcode($this,$this->barcode_type_code); - $sql = "SELECT count(*) as nb"; - $sql.= " FROM ".MAIN_DB_PREFIX."product"; - $sql.= " WHERE entity IN (".getEntity('product', 1).")"; - $sql.= " AND ref = '" .$this->ref."'"; + // Check more parameters + // If error, this->errors[] is filled + $result = $this->verify(); - $result = $this->db->query($sql); - if ($result) - { - $obj = $this->db->fetch_object($result); - if ($obj->nb == 0) + if ($result >= 0) + { + $sql = "SELECT count(*) as nb"; + $sql.= " FROM ".MAIN_DB_PREFIX."product"; + $sql.= " WHERE entity IN (".getEntity('product', 1).")"; + $sql.= " AND ref = '" .$this->ref."'"; + + $result = $this->db->query($sql); + if ($result) { - // Produit non deja existant - $sql = "INSERT INTO ".MAIN_DB_PREFIX."product ("; - $sql.= "datec"; - $sql.= ", entity"; - $sql.= ", ref"; - $sql.= ", ref_ext"; - $sql.= ", price_min"; - $sql.= ", price_min_ttc"; - $sql.= ", label"; - $sql.= ", fk_user_author"; - $sql.= ", fk_product_type"; - $sql.= ", price"; - $sql.= ", price_ttc"; - $sql.= ", price_base_type"; - $sql.= ", tobuy"; - $sql.= ", tosell"; - $sql.= ", accountancy_code_buy"; - $sql.= ", accountancy_code_sell"; - $sql.= ", canvas"; - $sql.= ", finished"; - $sql.= ") VALUES ("; - $sql.= "'".$this->db->idate($now)."'"; - $sql.= ", ".$conf->entity; - $sql.= ", '".$this->db->escape($this->ref)."'"; - $sql.= ", ".(! empty($this->ref_ext)?"'".$this->db->escape($this->ref_ext)."'":"null"); - $sql.= ", ".price2num($price_min_ht); - $sql.= ", ".price2num($price_min_ttc); - $sql.= ", ".(! empty($this->libelle)?"'".$this->db->escape($this->libelle)."'":"null"); - $sql.= ", ".$user->id; - $sql.= ", ".$this->type; - $sql.= ", ".price2num($price_ht); - $sql.= ", ".price2num($price_ttc); - $sql.= ", '".$this->price_base_type."'"; - $sql.= ", ".$this->status; - $sql.= ", ".$this->status_buy; - $sql.= ", '".$this->accountancy_code_buy."'"; - $sql.= ", '".$this->accountancy_code_sell."'"; - $sql.= ", '".$this->canvas."'"; - $sql.= ", ".((! isset($this->finished) || $this->finished < 0 || $this->finished == '') ? 'null' : $this->finished); - $sql.= ")"; - - dol_syslog(get_class($this)."::Create sql=".$sql); - $result = $this->db->query($sql); - if ( $result ) + $obj = $this->db->fetch_object($result); + if ($obj->nb == 0) { - $id = $this->db->last_insert_id(MAIN_DB_PREFIX."product"); + // Produit non deja existant + $sql = "INSERT INTO ".MAIN_DB_PREFIX."product ("; + $sql.= "datec"; + $sql.= ", entity"; + $sql.= ", ref"; + $sql.= ", ref_ext"; + $sql.= ", price_min"; + $sql.= ", price_min_ttc"; + $sql.= ", label"; + $sql.= ", fk_user_author"; + $sql.= ", fk_product_type"; + $sql.= ", price"; + $sql.= ", price_ttc"; + $sql.= ", price_base_type"; + $sql.= ", tobuy"; + $sql.= ", tosell"; + $sql.= ", accountancy_code_buy"; + $sql.= ", accountancy_code_sell"; + $sql.= ", canvas"; + $sql.= ", finished"; + $sql.= ") VALUES ("; + $sql.= "'".$this->db->idate($now)."'"; + $sql.= ", ".$conf->entity; + $sql.= ", '".$this->db->escape($this->ref)."'"; + $sql.= ", ".(! empty($this->ref_ext)?"'".$this->db->escape($this->ref_ext)."'":"null"); + $sql.= ", ".price2num($price_min_ht); + $sql.= ", ".price2num($price_min_ttc); + $sql.= ", ".(! empty($this->libelle)?"'".$this->db->escape($this->libelle)."'":"null"); + $sql.= ", ".$user->id; + $sql.= ", ".$this->type; + $sql.= ", ".price2num($price_ht); + $sql.= ", ".price2num($price_ttc); + $sql.= ", '".$this->price_base_type."'"; + $sql.= ", ".$this->status; + $sql.= ", ".$this->status_buy; + $sql.= ", '".$this->accountancy_code_buy."'"; + $sql.= ", '".$this->accountancy_code_sell."'"; + $sql.= ", '".$this->canvas."'"; + $sql.= ", ".((! isset($this->finished) || $this->finished < 0 || $this->finished == '') ? 'null' : $this->finished); + $sql.= ")"; - if ($id > 0) + dol_syslog(get_class($this)."::Create sql=".$sql); + $result = $this->db->query($sql); + if ( $result ) { - $this->id = $id; - $this->price = $price_ht; - $this->price_ttc = $price_ttc; - $this->price_min = $price_min_ht; - $this->price_min_ttc = $price_min_ttc; + $id = $this->db->last_insert_id(MAIN_DB_PREFIX."product"); - $result = $this->_log_price($user); - if ($result > 0) + if ($id > 0) { - if ($this->update($id, $user, true, 'add') <= 0) + $this->id = $id; + $this->price = $price_ht; + $this->price_ttc = $price_ttc; + $this->price_min = $price_min_ht; + $this->price_min_ttc = $price_min_ttc; + + $result = $this->_log_price($user); + if ($result > 0) { - $error++; + if ($this->update($id, $user, true, 'add') <= 0) + { + $error++; + } + } + else + { + $error++; + $this->error=$this->db->lasterror(); } } else { $error++; - $this->error=$this->db->lasterror(); + $this->error='ErrorFailedToGetInsertedId'; } } else { $error++; - $this->error='ErrorFailedToGetInsertedId'; + $this->error=$this->db->lasterror(); } } else { + // Product already exists with this ref + $langs->load("products"); $error++; - $this->error=$this->db->lasterror(); + $this->error = "ErrorProductAlreadyExists"; } } else { - // Product already exists with this ref - $langs->load("products"); $error++; - $this->error = "ErrorProductAlreadyExists"; + $this->error=$this->db->lasterror(); } - } - else - { - $error++; - $this->error=$this->db->lasterror(); - } - if (! $error && ! $notrigger) - { - // Appel des triggers - include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; - $interface=new Interfaces($this->db); - $result=$interface->run_triggers('PRODUCT_CREATE',$this,$user,$langs,$conf); - if ($result < 0) { $error++; $this->errors=$interface->errors; } - // Fin appel triggers - } + if (! $error && ! $notrigger) + { + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($this->db); + $result=$interface->run_triggers('PRODUCT_CREATE',$this,$user,$langs,$conf); + if ($result < 0) { $error++; $this->errors=$interface->errors; } + // Fin appel triggers + } + + if (! $error) + { + $this->db->commit(); + return $this->id; + } + else + { + $this->db->rollback(); + return -$error; + } + } + else + { + $this->db->rollback(); + dol_syslog(get_class($this)."::Create fails verify ".join(',',$this->errors), LOG_WARNING); + return -3; + } - if (! $error) - { - $this->db->commit(); - return $this->id; - } - else - { - $this->db->rollback(); - return -$error; - } } + + /** + * Check properties of product are ok (like name, barcode, ...) + * + * @return int 0 if OK, <0 if KO + */ + function verify() + { + $this->errors=array(); + + $result = 0; + $this->ref = trim($this->ref); + + if (! $this->ref) + { + $this->errors[] = 'ErrorBadRef'; + $result = -2; + } + + $rescode = $this->check_barcode($this->barcode); + if ($rescode <> 0) + { + if ($rescode == -1) + { + $this->errors[] = 'ErrorBadBarCodeSyntax'; + } + if ($rescode == -2) + { + $this->errors[] = 'ErrorBarCodeRequired'; + } + if ($rescode == -3) + { + $this->errors[] = 'ErrorBarCodeAlreadyUsed'; + } + $result = -3; + } + + return $result; + } + + /** + * Check customer code + * + * @param string $valuetotest Value to test + * @return int 0 if OK + * -1 ErrorBadBarCodeSyntax + * -2 ErrorBarCodeRequired + * -3 ErrorBarCodeAlreadyUsed + */ + function check_barcode($valuetotest) + { + global $conf; + if (! empty($conf->barcode->enabled) && ! empty($conf->global->BARCODE_PRODUCT_ADDON_NUM)) + { + $module=strtolower($conf->global->BARCODE_PRODUCT_ADDON_NUM); + + $dirsociete=array_merge(array('/core/modules/barcode/'),$conf->modules_parts['barcode']); + foreach ($dirsociete as $dirroot) + { + $res=dol_include_once($dirroot.$module.'.php'); + if ($res) break; + } + + $mod = new $module(); + + dol_syslog(get_class($this)."::check_barcode barcode=".$valuetotest." module=".$module); + $result = $mod->verif($this->db, $valuetotest, $this, 0); + return $result; + } + else + { + return 0; + } + } + /** * Update a record into database * * @param int $id Id of product * @param User $user Object user making update * @param int $notrigger Disable triggers - * @param string $action Current action for hookmanager + * @param string $action Current action for hookmanager ('add' or 'update') * @return int 1 if OK, -1 if ref already exists, -2 if other error */ function update($id, $user, $notrigger=false, $action='update') @@ -443,9 +532,7 @@ class Product extends CommonObject $error=0; - $this->db->begin(); - - // Verification parametres + // Check parameters if (! $this->libelle) $this->libelle = 'MISSING LABEL'; // Clean parameters @@ -473,135 +560,154 @@ class Product extends CommonObject //Gencod $this->barcode=trim($this->barcode); - // For automatic creation - if ($this->barcode == -1) $this->get_barcode($this,$this->barcode_type_code); - $this->accountancy_code_buy = trim($this->accountancy_code_buy); $this->accountancy_code_sell= trim($this->accountancy_code_sell); - $sql = "UPDATE ".MAIN_DB_PREFIX."product"; - $sql.= " SET label = '" . $this->db->escape($this->libelle) ."'"; - $sql.= ", ref = '" . $this->ref ."'"; - $sql.= ", ref_ext = ".(! empty($this->ref_ext)?"'".$this->db->escape($this->ref_ext)."'":"null"); - $sql.= ", tva_tx = " . $this->tva_tx; - $sql.= ", recuperableonly = " . $this->tva_npr; - $sql.= ", localtax1_tx = " . $this->localtax1_tx; - $sql.= ", localtax2_tx = " . $this->localtax2_tx; - $sql.= ", barcode = ". (empty($this->barcode)?"null":"'".$this->db->escape($this->barcode)."'"); - $sql.= ", fk_barcode_type = ". (empty($this->barcode_type)?"null":$this->db->escape($this->barcode_type)); + $this->db->begin(); - $sql.= ", tosell = " . $this->status; - $sql.= ", tobuy = " . $this->status_buy; - $sql.= ", finished = " . ((! isset($this->finished) || $this->finished < 0) ? "null" : $this->finished); - $sql.= ", weight = " . ($this->weight!='' ? "'".$this->weight."'" : 'null'); - $sql.= ", weight_units = " . ($this->weight_units!='' ? "'".$this->weight_units."'": 'null'); - $sql.= ", length = " . ($this->length!='' ? "'".$this->length."'" : 'null'); - $sql.= ", length_units = " . ($this->length_units!='' ? "'".$this->length_units."'" : 'null'); - $sql.= ", surface = " . ($this->surface!='' ? "'".$this->surface."'" : 'null'); - $sql.= ", surface_units = " . ($this->surface_units!='' ? "'".$this->surface_units."'" : 'null'); - $sql.= ", volume = " . ($this->volume!='' ? "'".$this->volume."'" : 'null'); - $sql.= ", volume_units = " . ($this->volume_units!='' ? "'".$this->volume_units."'" : 'null'); - $sql.= ", seuil_stock_alerte = " . ((isset($this->seuil_stock_alerte) && $this->seuil_stock_alerte != '') ? "'".$this->seuil_stock_alerte."'" : "null"); - $sql.= ", description = '" . $this->db->escape($this->description) ."'"; - $sql.= ", customcode = '" . $this->db->escape($this->customcode) ."'"; - $sql.= ", fk_country = " . ($this->country_id > 0 ? $this->country_id : 'null'); - $sql.= ", note = '" . $this->db->escape($this->note) ."'"; - $sql.= ", duration = '" . $this->duration_value . $this->duration_unit ."'"; - $sql.= ", accountancy_code_buy = '" . $this->accountancy_code_buy."'"; - $sql.= ", accountancy_code_sell= '" . $this->accountancy_code_sell."'"; - $sql.= ", desiredstock = " . ((isset($this->desiredstock) && $this->desiredstock != '') ? $this->desiredstock : "null"); - $sql.= " WHERE rowid = " . $id; + // Check name is required and codes are ok or unique. + // If error, this->errors[] is filled + if ($action != 'add') + { + $result = $this->verify(); // We don't check when update called during a create because verify was already done + } - dol_syslog(get_class($this)."update sql=".$sql); - $resql=$this->db->query($sql); - if ($resql) - { - $this->id = $id; + if ($result >= 0) + { + // For automatic creation + if ($this->barcode == -1) $this->get_barcode($this,$this->barcode_type_code); - // Multilangs - if (! empty($conf->global->MAIN_MULTILANGS)) + $sql = "UPDATE ".MAIN_DB_PREFIX."product"; + $sql.= " SET label = '" . $this->db->escape($this->libelle) ."'"; + $sql.= ", ref = '" . $this->ref ."'"; + $sql.= ", ref_ext = ".(! empty($this->ref_ext)?"'".$this->db->escape($this->ref_ext)."'":"null"); + $sql.= ", tva_tx = " . $this->tva_tx; + $sql.= ", recuperableonly = " . $this->tva_npr; + $sql.= ", localtax1_tx = " . $this->localtax1_tx; + $sql.= ", localtax2_tx = " . $this->localtax2_tx; + + $sql.= ", barcode = ". (empty($this->barcode)?"null":"'".$this->db->escape($this->barcode)."'"); + $sql.= ", fk_barcode_type = ". (empty($this->barcode_type)?"null":$this->db->escape($this->barcode_type)); + + $sql.= ", tosell = " . $this->status; + $sql.= ", tobuy = " . $this->status_buy; + $sql.= ", finished = " . ((! isset($this->finished) || $this->finished < 0) ? "null" : $this->finished); + $sql.= ", weight = " . ($this->weight!='' ? "'".$this->weight."'" : 'null'); + $sql.= ", weight_units = " . ($this->weight_units!='' ? "'".$this->weight_units."'": 'null'); + $sql.= ", length = " . ($this->length!='' ? "'".$this->length."'" : 'null'); + $sql.= ", length_units = " . ($this->length_units!='' ? "'".$this->length_units."'" : 'null'); + $sql.= ", surface = " . ($this->surface!='' ? "'".$this->surface."'" : 'null'); + $sql.= ", surface_units = " . ($this->surface_units!='' ? "'".$this->surface_units."'" : 'null'); + $sql.= ", volume = " . ($this->volume!='' ? "'".$this->volume."'" : 'null'); + $sql.= ", volume_units = " . ($this->volume_units!='' ? "'".$this->volume_units."'" : 'null'); + $sql.= ", seuil_stock_alerte = " . ((isset($this->seuil_stock_alerte) && $this->seuil_stock_alerte != '') ? "'".$this->seuil_stock_alerte."'" : "null"); + $sql.= ", description = '" . $this->db->escape($this->description) ."'"; + $sql.= ", customcode = '" . $this->db->escape($this->customcode) ."'"; + $sql.= ", fk_country = " . ($this->country_id > 0 ? $this->country_id : 'null'); + $sql.= ", note = '" . $this->db->escape($this->note) ."'"; + $sql.= ", duration = '" . $this->duration_value . $this->duration_unit ."'"; + $sql.= ", accountancy_code_buy = '" . $this->accountancy_code_buy."'"; + $sql.= ", accountancy_code_sell= '" . $this->accountancy_code_sell."'"; + $sql.= ", desiredstock = " . ((isset($this->desiredstock) && $this->desiredstock != '') ? $this->desiredstock : "null"); + $sql.= " WHERE rowid = " . $id; + + dol_syslog(get_class($this)."update sql=".$sql); + $resql=$this->db->query($sql); + if ($resql) { - if ( $this->setMultiLangs() < 0) - { - $this->error=$langs->trans("Error")." : ".$this->db->error()." - ".$sql; - return -2; - } - } + $this->id = $id; - // Actions on extra fields (by external module or standard code) - $hookmanager->initHooks(array('productdao')); - $parameters=array('id'=>$this->id); - $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if (empty($reshook)) - { - if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used + // Multilangs + if (! empty($conf->global->MAIN_MULTILANGS)) { - $result=$this->insertExtraFields(); - if ($result < 0) + if ( $this->setMultiLangs() < 0) { - $error++; + $this->error=$langs->trans("Error")." : ".$this->db->error()." - ".$sql; + return -2; } } - } - else if ($reshook < 0) $error++; - if (! $error && ! $notrigger) - { - // Appel des triggers - include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; - $interface=new Interfaces($this->db); - $result=$interface->run_triggers('PRODUCT_MODIFY',$this,$user,$langs,$conf); - if ($result < 0) { $error++; $this->errors=$interface->errors; } - // Fin appel triggers - } - - if (! $error && (is_object($this->oldcopy) && $this->oldcopy->ref != $this->ref)) - { - // We remove directory - if ($conf->product->dir_output) + // Actions on extra fields (by external module or standard code) + $hookmanager->initHooks(array('productdao')); + $parameters=array('id'=>$this->id); + $reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if (empty($reshook)) { - $olddir = $conf->product->dir_output . "/" . dol_sanitizeFileName($this->oldcopy->ref); - $newdir = $conf->product->dir_output . "/" . dol_sanitizeFileName($this->ref); - if (file_exists($olddir)) + if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used { - include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; - $res=@dol_move($olddir, $newdir); - if (! $res) + $result=$this->insertExtraFields(); + if ($result < 0) { - $this->error='ErrorFailToMoveDir'; $error++; } } } - } + else if ($reshook < 0) $error++; - if (! $error) - { - $this->db->commit(); - return 1; + if (! $error && ! $notrigger) + { + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($this->db); + $result=$interface->run_triggers('PRODUCT_MODIFY',$this,$user,$langs,$conf); + if ($result < 0) { $error++; $this->errors=$interface->errors; } + // Fin appel triggers + } + + if (! $error && (is_object($this->oldcopy) && $this->oldcopy->ref != $this->ref)) + { + // We remove directory + if ($conf->product->dir_output) + { + $olddir = $conf->product->dir_output . "/" . dol_sanitizeFileName($this->oldcopy->ref); + $newdir = $conf->product->dir_output . "/" . dol_sanitizeFileName($this->ref); + if (file_exists($olddir)) + { + include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + $res=@dol_move($olddir, $newdir); + if (! $res) + { + $this->error='ErrorFailToMoveDir'; + $error++; + } + } + } + } + + if (! $error) + { + $this->db->commit(); + return 1; + } + else + { + $this->db->rollback(); + return -$error; + } } else { - $this->db->rollback(); - return -$error; + if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') + { + $this->error=$langs->trans("Error")." : ".$langs->trans("ErrorProductAlreadyExists",$this->ref); + $this->db->rollback(); + return -1; + } + else + { + $this->error=$langs->trans("Error")." : ".$this->db->error()." - ".$sql; + $this->db->rollback(); + return -2; + } } - } - else - { - if ($this->db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') - { - $this->error=$langs->trans("Error")." : ".$langs->trans("ErrorProductAlreadyExists",$this->ref); - $this->db->rollback(); - return -1; - } - else - { - $this->error=$langs->trans("Error")." : ".$this->db->error()." - ".$sql; - $this->db->rollback(); - return -2; - } - } + } + else + { + $this->db->rollback(); + dol_syslog(get_class($this)."::Update fails verify ".join(',',$this->errors), LOG_WARNING); + return -3; + } } /** @@ -3156,6 +3262,8 @@ class Product extends CommonObject $this->tobuy=1; $this->type=0; $this->note='This is a comment (private)'; + + $this->barcode=-1; // Create barcode automatically } } ?> diff --git a/htdocs/product/fiche.php b/htdocs/product/fiche.php index ca47227e1f0..6a86dbe3217 100644 --- a/htdocs/product/fiche.php +++ b/htdocs/product/fiche.php @@ -117,10 +117,25 @@ if (empty($reshook)) // Barcode value if ($action == 'setbarcode' && $user->rights->barcode->creer) { - //Todo: ajout verification de la validite du code barre en fonction du type - $result = $object->setValueFrom('barcode', GETPOST('barcode')); - header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); - exit; + $result=$object->check_barcode(GETPOST('barcode')); + + if ($result >= 0) + { + $result = $object->setValueFrom('barcode', GETPOST('barcode')); + header("Location: ".$_SERVER['PHP_SELF']."?id=".$object->id); + exit; + } + else + { + $langs->load("errors"); + if ($result == -1) $errors[] = 'ErrorBadBarCodeSyntax'; + else if ($result == -2) $errors[] = 'ErrorBarCodeRequired'; + else if ($result == -3) $errors[] = 'ErrorBarCodeAlreadyUsed'; + else $errors[] = 'FailedToValidateBarCode'; + + $error++; + setEventMessage($errors,'errors'); + } } if ($action == 'setaccountancy_code_buy') @@ -236,8 +251,9 @@ if (empty($reshook)) exit; } else - { - setEventMessage($langs->trans($object->error), 'errors'); + { + if (count($object->errors)) setEventMessage($object->errors, 'errors'); + else setEventMessage($langs->trans($object->error), 'errors'); $action = "create"; } } @@ -279,7 +295,11 @@ if (empty($reshook)) $object->volume_units = GETPOST('volume_units'); $object->finished = GETPOST('finished'); $object->hidden = GETPOST('hidden')=='yes'?1:0; - $object->accountancy_code_sell = GETPOST('accountancy_code_sell'); + + $object->barcode_type = GETPOST('fk_barcode_type'); + $object->barcode = GETPOST('barcode'); + + $object->accountancy_code_sell = GETPOST('accountancy_code_sell'); $object->accountancy_code_buy = GETPOST('accountancy_code_buy'); // Fill array 'array_options' with data from add form @@ -292,14 +312,16 @@ if (empty($reshook)) $action = 'view'; } else - { - setEventMessage($langs->trans($object->error), 'errors'); + { + if (count($object->errors)) setEventMessage($object->errors, 'errors'); + else setEventMessage($langs->trans($object->error), 'errors'); $action = 'edit'; } } else - { - setEventMessage($langs->trans("ErrorProductBadRefOrLabel"), 'errors'); + { + if (count($object->errors)) setEventMessage($object->errors, 'errors'); + else setEventMessage($langs->trans("ErrorProductBadRefOrLabel"), 'errors'); $action = 'edit'; } } @@ -762,8 +784,8 @@ else print $formbarcode->select_barcode_type($fk_barcode_type, 'fk_barcode_type', 1); print ''.$langs->trans("BarcodeValue").''; $tmpcode=isset($_POST['barcode'])?GETPOST('barcode'):$object->barcode; - if (! empty($modBarCodeProduct->code_auto)) $tmpcode=$modBarCodeProduct->getNextValue($object,$type); - print ''; + if (empty($tmpcode) && ! empty($modBarCodeProduct->code_auto)) $tmpcode=$modBarCodeProduct->getNextValue($object,$type); + print ''; print ''; } @@ -871,7 +893,7 @@ else // We must set them on prices tab. } else - { + { print ''; // PRIX @@ -955,7 +977,7 @@ else // Label print ''; - // Status + // Status To sell print ''; - // To Buy + // Status To Buy print ''; + // Barcode + $showbarcode=(! empty($conf->barcode->enabled) && $user->rights->barcode->lire); + + if ($showbarcode) + { + print ''; + } + // Description (used in invoice, propal...) print '
'.$langs->trans("Label").'
'.$langs->trans("Status").' ('.$langs->trans("Sell").')'; print ''; print '
'.$langs->trans("Status").' ('.$langs->trans("Buy").')'; print ''; print '
'.$langs->trans('BarcodeType').''; + if (isset($_POST['fk_barcode_type'])) + { + $fk_barcode_type=GETPOST('fk_barcode_type'); + } + else + { + if (empty($fk_barcode_type) && ! empty($conf->global->PRODUIT_DEFAULT_BARCODE_TYPE)) $fk_barcode_type = $conf->global->PRODUIT_DEFAULT_BARCODE_TYPE; + } + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formbarcode.class.php'; + $formbarcode = new FormBarCode($db); + print $formbarcode->select_barcode_type($fk_barcode_type, 'fk_barcode_type', 1); + print ''.$langs->trans("BarcodeValue").''; + $tmpcode=isset($_POST['barcode'])?GETPOST('barcode'):$object->barcode; + if (empty($tmpcode) && ! empty($modBarCodeProduct->code_auto)) $tmpcode=$modBarCodeProduct->getNextValue($object,$type); + print ''; + print '
'.$langs->trans("Description").''; @@ -1100,7 +1146,7 @@ else print ''; // Accountancy_code_sell - print ''; + print ''; print ''; @@ -1121,7 +1167,7 @@ else } // Fiche en mode visu else - { + { $head=product_prepare_head($object, $user); $titre=$langs->trans("CardProduct".$object->type); $picto=($object->type==1?'service':'product'); diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 93befedfc76..225a2dab5c8 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004-2014 Laurent Destailleur * Copyright (C) 2004 Eric Seigne * Copyright (C) 2003 Brian Fraval * Copyright (C) 2006 Andre Cianfarani @@ -208,8 +208,8 @@ class Societe extends CommonObject $this->db->begin(); // For automatic creation during create action (not used by Dolibarr GUI, can be used by scripts) - if ($this->code_client == -1) $this->get_codeclient($this->prefix_comm,0); - if ($this->code_fournisseur == -1) $this->get_codefournisseur($this->prefix_comm,1); + if ($this->code_client == -1) $this->get_codeclient($this,0); + if ($this->code_fournisseur == -1) $this->get_codefournisseur($this,1); // Check more parameters // If error, this->errors[] is filled @@ -290,14 +290,21 @@ class Societe extends CommonObject } else - { + { $this->db->rollback(); dol_syslog(get_class($this)."::Create fails verify ".join(',',$this->errors), LOG_WARNING); return -3; } } - function create_individual($user) { + /** + * Create a contact/address from thirdparty + * + * @param User $user Object user + * @return int <0 if KO, >0 if OK + */ + function create_individual($user) + { require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; $contact=new Contact($this->db); @@ -313,11 +320,13 @@ class Societe extends CommonObject $contact->zip = $this->zip; $contact->town = $this->town; $contact->phone_pro = $this->phone; + $result = $contact->create($user); - if ($result < 0) { + if ($result < 0) + { $this->error = $contact->error; $this->errors = $contact->errors; - dol_syslog("Societe::create_individual ERROR:" . $this->error, LOG_ERR); + dol_syslog(get_class($this)."::create_individual ERROR:" . $this->error, LOG_ERR); } return $result; @@ -325,6 +334,7 @@ class Societe extends CommonObject /** * Check properties of third party are ok (like name, third party codes, ...) + * Used before an add or update. * * @return int 0 if OK, <0 if KO */ @@ -342,10 +352,8 @@ class Societe extends CommonObject $result = -2; } - if ($this->client && $this->codeclient_modifiable()) + if ($this->client) { - // On ne verifie le code client que si la societe est un client / prospect et que le code est modifiable - // Si il n'est pas modifiable il n'est pas mis a jour lors de l'update $rescode = $this->check_codeclient(); if ($rescode <> 0) { @@ -369,10 +377,8 @@ class Societe extends CommonObject } } - if ($this->fournisseur && $this->codefournisseur_modifiable()) + if ($this->fournisseur) { - // On ne verifie le code fournisseur que si la societe est un fournisseur et que le code est modifiable - // Si il n'est pas modifiable il n'est pas mis a jour lors de l'update $rescode = $this->check_codefournisseur(); if ($rescode <> 0) { @@ -407,7 +413,7 @@ class Societe extends CommonObject * @param int $call_trigger 0=non, 1=oui * @param int $allowmodcodeclient Inclut modif code client et code compta * @param int $allowmodcodefournisseur Inclut modif code fournisseur et code compta fournisseur - * @param string $action 'create' or 'update' + * @param string $action 'add' or 'update' * @param int $nosyncmember Do not synchronize info of linked member * @return int <0 if KO, >=0 if OK */ @@ -467,8 +473,8 @@ class Societe extends CommonObject $this->barcode=trim($this->barcode); // For automatic creation - if ($this->code_client == -1) $this->get_codeclient($this->prefix_comm,0); - if ($this->code_fournisseur == -1) $this->get_codefournisseur($this->prefix_comm,1); + if ($this->code_client == -1) $this->get_codeclient($this,0); + if ($this->code_fournisseur == -1) $this->get_codefournisseur($this,1); $this->code_compta=trim($this->code_compta); $this->code_compta_fournisseur=trim($this->code_compta_fournisseur); @@ -517,7 +523,7 @@ class Societe extends CommonObject // Check name is required and codes are ok or unique. // If error, this->errors[] is filled - $result = $this->verify(); + if ($action != 'add') $result = $this->verify(); // We don't check when update called during a create because verify was already done if ($result >= 0) { @@ -574,16 +580,12 @@ class Societe extends CommonObject if ($customer) { - //$this->check_codeclient(); - $sql .= ", code_client = ".(! empty($this->code_client)?"'".$this->db->escape($this->code_client)."'":"null"); $sql .= ", code_compta = ".(! empty($this->code_compta)?"'".$this->db->escape($this->code_compta)."'":"null"); } if ($supplier) { - //$this->check_codefournisseur(); - $sql .= ", code_fournisseur = ".(! empty($this->code_fournisseur)?"'".$this->db->escape($this->code_fournisseur)."'":"null"); $sql .= ", code_compta_fournisseur = ".(! empty($this->code_compta_fournisseur)?"'".$this->db->escape($this->code_compta_fournisseur)."'":"null"); } @@ -621,7 +623,7 @@ class Societe extends CommonObject //$lmember->lastname=$this->lastname?$this->lastname:$lmember->lastname; // We keep firstname and lastname of member unchanged $lmember->address=$this->address; $lmember->email=$this->email; - $lmember->skype=$this->skype; + $lmember->skype=$this->skype; $lmember->phone=$this->phone; $result=$lmember->update($user,0,1,1,1); // Use nosync to 1 to avoid cyclic updates @@ -700,7 +702,7 @@ class Societe extends CommonObject } } else - { + { $this->db->rollback(); dol_syslog(get_class($this)."::Update fails verify ".join(',',$this->errors), LOG_WARNING); return -3; @@ -1815,19 +1817,20 @@ class Societe extends CommonObject global $conf; if (! empty($conf->global->SOCIETE_CODECLIENT_ADDON)) { + $module=$conf->global->SOCIETE_CODECLIENT_ADDON; + $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); foreach ($dirsociete as $dirroot) { - $res=dol_include_once($dirroot.$conf->global->SOCIETE_CODECLIENT_ADDON.'.php'); + $res=dol_include_once($dirroot.$module.'.php'); if ($res) break; } - $var = $conf->global->SOCIETE_CODECLIENT_ADDON; - $mod = new $var; + $mod = new $module(); $this->code_client = $mod->getNextValue($objsoc,$type); $this->prefixCustomerIsRequired = $mod->prefixIsRequired; - dol_syslog(get_class($this)."::get_codeclient code_client=".$this->code_client." module=".$var); + dol_syslog(get_class($this)."::get_codeclient code_client=".$this->code_client." module=".$module); } } @@ -1844,18 +1847,19 @@ class Societe extends CommonObject global $conf; if (! empty($conf->global->SOCIETE_CODECLIENT_ADDON)) { + $module=$conf->global->SOCIETE_CODECLIENT_ADDON; + $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); foreach ($dirsociete as $dirroot) { - $res=dol_include_once($dirroot.$conf->global->SOCIETE_CODECLIENT_ADDON.'.php'); + $res=dol_include_once($dirroot.$module.'.php'); if ($res) break; } - $var = $conf->global->SOCIETE_CODECLIENT_ADDON; - $mod = new $var; + $mod = new $module(); $this->code_fournisseur = $mod->getNextValue($objsoc,$type); - dol_syslog(get_class($this)."::get_codefournisseur code_fournisseur=".$this->code_fournisseur." module=".$var); + dol_syslog(get_class($this)."::get_codefournisseur code_fournisseur=".$this->code_fournisseur." module=".$module); } } @@ -1863,25 +1867,25 @@ class Societe extends CommonObject * Verifie si un code client est modifiable en fonction des parametres * du module de controle des codes. * - * @return int 0=Non, 1=Oui + * @return int 0=No, 1=Yes */ function codeclient_modifiable() { global $conf; if (! empty($conf->global->SOCIETE_CODECLIENT_ADDON)) { + $module=$conf->global->SOCIETE_CODECLIENT_ADDON; + $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); foreach ($dirsociete as $dirroot) { - $res=dol_include_once($dirroot.$conf->global->SOCIETE_CODECLIENT_ADDON.'.php'); + $res=dol_include_once($dirroot.$module.'.php'); if ($res) break; } - $var = $conf->global->SOCIETE_CODECLIENT_ADDON; + $mod = new $module(); - $mod = new $var; - - dol_syslog(get_class($this)."::codeclient_modifiable code_client=".$this->code_client." module=".$var); + dol_syslog(get_class($this)."::codeclient_modifiable code_client=".$this->code_client." module=".$module); if ($mod->code_modifiable_null && ! $this->code_client) return 1; if ($mod->code_modifiable_invalide && $this->check_codeclient() < 0) return 1; if ($mod->code_modifiable) return 1; // A mettre en dernier @@ -1897,25 +1901,25 @@ class Societe extends CommonObject /** * Verifie si un code fournisseur est modifiable dans configuration du module de controle des codes * - * @return int 0=Non, 1=Oui + * @return int 0=No, 1=Yes */ function codefournisseur_modifiable() { global $conf; if (! empty($conf->global->SOCIETE_CODECLIENT_ADDON)) { + $module=$conf->global->SOCIETE_CODECLIENT_ADDON; + $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); foreach ($dirsociete as $dirroot) { - $res=dol_include_once($dirroot.$conf->global->SOCIETE_CODECLIENT_ADDON.'.php'); + $res=dol_include_once($dirroot.$module.'.php'); if ($res) break; } - $var = $conf->global->SOCIETE_CODECLIENT_ADDON; + $mod = new $module(); - $mod = new $var; - - dol_syslog(get_class($this)."::codefournisseur_modifiable code_founisseur=".$this->code_fournisseur." module=".$var); + dol_syslog(get_class($this)."::codefournisseur_modifiable code_founisseur=".$this->code_fournisseur." module=".$module); if ($mod->code_modifiable_null && ! $this->code_fournisseur) return 1; if ($mod->code_modifiable_invalide && $this->check_codefournisseur() < 0) return 1; if ($mod->code_modifiable) return 1; // A mettre en dernier @@ -1929,36 +1933,36 @@ class Societe extends CommonObject /** - * Check customer code + * Check customer code * - * @return int 0 if OK - * -1 ErrorBadCustomerCodeSyntax - * -2 ErrorCustomerCodeRequired - * -3 ErrorCustomerCodeAlreadyUsed - * -4 ErrorPrefixRequired + * @return int 0 if OK + * -1 ErrorBadCustomerCodeSyntax + * -2 ErrorCustomerCodeRequired + * -3 ErrorCustomerCodeAlreadyUsed + * -4 ErrorPrefixRequired */ function check_codeclient() { global $conf; if (! empty($conf->global->SOCIETE_CODECLIENT_ADDON)) { - $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); + $module=$conf->global->SOCIETE_CODECLIENT_ADDON; + + $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); foreach ($dirsociete as $dirroot) { - $res=dol_include_once($dirroot.$conf->global->SOCIETE_CODECLIENT_ADDON.'.php'); + $res=dol_include_once($dirroot.$module.'.php'); if ($res) break; } - $var = $conf->global->SOCIETE_CODECLIENT_ADDON; + $mod = new $module(); - $mod = new $var; - - dol_syslog(get_class($this)."::check_codeclient code_client=".$this->code_client." module=".$var); - $result = $mod->verif($this->db, $this->code_client, $this, 0); + dol_syslog(get_class($this)."::check_codeclient code_client=".$this->code_client." module=".$module); + $result = $mod->verif($this->db, $this->code_client, $this, 0); return $result; } else - { + { return 0; } } @@ -1977,23 +1981,23 @@ class Societe extends CommonObject global $conf; if (! empty($conf->global->SOCIETE_CODECLIENT_ADDON)) { - $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); + $module=$conf->global->SOCIETE_CODECLIENT_ADDON; + + $dirsociete=array_merge(array('/core/modules/societe/'),$conf->modules_parts['societe']); foreach ($dirsociete as $dirroot) { - $res=dol_include_once($dirroot.$conf->global->SOCIETE_CODECLIENT_ADDON.'.php'); + $res=dol_include_once($dirroot.$module.'.php'); if ($res) break; } - $var = $conf->global->SOCIETE_CODECLIENT_ADDON; + $mod = new $module(); - $mod = new $var; - - dol_syslog(get_class($this)."::check_codefournisseur code_fournisseur=".$this->code_fournisseur." module=".$var); + dol_syslog(get_class($this)."::check_codefournisseur code_fournisseur=".$this->code_fournisseur." module=".$module); $result = $mod->verif($this->db, $this->code_fournisseur, $this, 1); return $result; } else - { + { return 0; } } diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index ab753855b4c..47c5c779582 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -789,8 +789,8 @@ else print '
'.$langs->trans("ProductAccountancySellCode").'
'.$langs->trans("ProductAccountancySellCode").''; print '
'.$langs->trans('CustomerCode').''; print '
'; $tmpcode=$object->code_client; - if ($modCodeClient->code_auto) $tmpcode=$modCodeClient->getNextValue($object,0); - print ''; + if (empty($tmpcode) && ! empty($modCodeClient->code_auto)) $tmpcode=$modCodeClient->getNextValue($object,0); + print ''; print ''; $s=$modCodeClient->getToolTip($langs,$object,0); print $form->textwithpicto('',$s,1); @@ -807,8 +807,8 @@ else print ''.$langs->trans('SupplierCode').''; print '
'; $tmpcode=$object->code_fournisseur; - if ($modCodeFournisseur->code_auto) $tmpcode=$modCodeFournisseur->getNextValue($object,1); - print ''; + if (empty($tmpcode) && ! empty($modCodeFournisseur->code_auto)) $tmpcode=$modCodeFournisseur->getNextValue($object,1); + print ''; print ''; $s=$modCodeFournisseur->getToolTip($langs,$object,1); print $form->textwithpicto('',$s,1); @@ -1189,8 +1189,8 @@ else if ((!$object->code_client || $object->code_client == -1) && $modCodeClient->code_auto) { $tmpcode=$object->code_client; - if (empty($tmpcode) && $modCodeClient->code_auto) $tmpcode=$modCodeClient->getNextValue($object,0); - print ''; + if (empty($tmpcode) && ! empty($modCodeClient->code_auto)) $tmpcode=$modCodeClient->getNextValue($object,0); + print ''; } else if ($object->codeclient_modifiable()) { @@ -1221,8 +1221,8 @@ else if ((!$object->code_fournisseur || $object->code_fournisseur == -1) && $modCodeFournisseur->code_auto) { $tmpcode=$object->code_fournisseur; - if (empty($tmpcode) && $modCodeFournisseur->code_auto) $tmpcode=$modCodeFournisseur->getNextValue($object,1); - print ''; + if (empty($tmpcode) && ! empty($modCodeFournisseur->code_auto)) $tmpcode=$modCodeFournisseur->getNextValue($object,1); + print ''; } else if ($object->codefournisseur_modifiable()) {