diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 6df0e2f006d..760b9632cb6 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -210,6 +210,11 @@ abstract class CommonObject */ public $ref_next; + /** + * @var string Ref to store on object to save the new ref to use for example when making a validate() of an object + */ + public $newref; + /** * @var int The object's status * @see setStatut() diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 563ba097b19..557bc2a0456 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1607,15 +1607,15 @@ class CommandeFournisseur extends CommonOrder $this->db->begin(); - if ($fk_product > 0) - { - if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) - { + $product_type = $type; + $label = ''; // deprecated + + if ($fk_product > 0) { + if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) { // Check quantity is enough dol_syslog(get_class($this)."::addline we check supplier prices fk_product=".$fk_product." fk_prod_fourn_price=".$fk_prod_fourn_price." qty=".$qty." ref_supplier=".$ref_supplier); $prod = new Product($this->db); - if ($prod->fetch($fk_product) > 0) - { + if ($prod->fetch($fk_product) > 0) { $product_type = $prod->type; $label = $prod->label; @@ -1664,25 +1664,20 @@ class CommandeFournisseur extends CommonOrder } } - // redefine quantity according to packaging - if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) - { + // Predefine quantity according to packaging + if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) { $prod = new Product($this->db, $fk_product); $prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product, 'none', ($this->fk_soc ? $this->fk_soc : $this->socid)); - if ($qty < $prod->packaging) - { + if ($qty < $prod->packaging) { $qty = $prod->packaging; } else { - if (!empty($prod->packaging) && ($qty % $prod->packaging) > 0) - { + if (!empty($prod->packaging) && ($qty % $prod->packaging) > 0) { $coeff = intval($qty / $prod->packaging) + 1; $qty = $prod->packaging * $coeff; } } setEventMessage($langs->trans('QtyRecalculatedWithPackaging'), 'mesgs'); } - } else { - $product_type = $type; } if (!empty($conf->multicurrency->enabled) && $pu_ht_devise > 0) { diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index abb6245fa22..987b80aa3ea 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -664,10 +664,8 @@ if (empty($reshook)) } $productsupplier = new ProductFournisseur($db); - if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) - { - if ($line->fk_product > 0 && $productsupplier->get_buyprice(0, price2num(GETPOST('qty', 'int')), $line->fk_product, 'none', GETPOST('socid', 'int')) < 0) - { + if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) { + if ($line->fk_product > 0 && $productsupplier->get_buyprice(0, price2num(GETPOST('qty', 'int')), $line->fk_product, 'none', GETPOST('socid', 'int')) < 0) { setEventMessages($langs->trans("ErrorQtyTooLowForThisSupplier"), null, 'warnings'); } } @@ -2317,7 +2315,6 @@ if ($action == 'create') global $forceall, $senderissupplier, $dateSelector, $inputalsopricewithtax; $forceall = 1; $dateSelector = 0; $inputalsopricewithtax = 1; $senderissupplier = 2; // $senderissupplier=2 is same than 1 but disable test on minimum qty and disable autofill qty with minimum. - //if (! empty($conf->global->SUPPLIER_ORDER_WITH_NOPRICEDEFINED)) $senderissupplier=2; if (!empty($conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY)) $senderissupplier = 1; // Show object lines diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 3201dd652aa..25051baa9c3 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -1720,9 +1720,9 @@ class Product extends CommonObject // We do a first seach with a select by searching with couple prodfournprice and qty only (later we will search on triplet qty/product_id/fourn_ref) $sql = "SELECT pfp.rowid, pfp.price as price, pfp.quantity as quantity, pfp.remise_percent,"; - $sql .= " pfp.fk_product, pfp.ref_fourn, pfp.desc_fourn, pfp.fk_soc, pfp.tva_tx, pfp.fk_supplier_price_expression"; - $sql .= " ,pfp.default_vat_code"; - $sql .= " ,pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code"; + $sql .= " pfp.fk_product, pfp.ref_fourn, pfp.desc_fourn, pfp.fk_soc, pfp.tva_tx, pfp.fk_supplier_price_expression,"; + $sql .= " pfp.default_vat_code,"; + $sql .= " pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code"; if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) $sql .= ", pfp.packaging"; $sql .= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp"; $sql .= " WHERE pfp.rowid = ".$prodfournprice; @@ -1769,14 +1769,13 @@ class Product extends CommonObject if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) $this->packaging = $obj->packaging; $result = $obj->fk_product; return $result; - } else // If not found - { + } else { // If not found // We do a second search by doing a select again but searching with less reliable criteria: couple qty/id product, and if set fourn_ref or fk_soc. - $sql = "SELECT pfp.rowid, pfp.price as price, pfp.quantity as quantity, pfp.fk_soc,"; - $sql .= " pfp.fk_product, pfp.ref_fourn as ref_supplier, pfp.desc_fourn as desc_supplier, pfp.tva_tx, pfp.fk_supplier_price_expression"; - $sql .= " ,pfp.default_vat_code"; - $sql .= " ,pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code"; - if (!empty($conf->global->PRODUCT_USE_SUPPLIER_PACKAGING)) $sql .= ", pfp.packaging"; + $sql = "SELECT pfp.rowid, pfp.price as price, pfp.quantity as quantity, pfp.remise_percent, pfp.fk_soc,"; + $sql .= " pfp.fk_product, pfp.ref_fourn as ref_supplier, pfp.desc_fourn as desc_supplier, pfp.tva_tx, pfp.fk_supplier_price_expression,"; + $sql .= " pfp.default_vat_code,"; + $sql .= " pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code,"; + $sql .= " pfp.packaging"; $sql .= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp"; $sql .= " WHERE pfp.fk_product = ".$product_id; if ($fourn_ref != 'none') { $sql .= " AND pfp.ref_fourn = '".$this->db->escape($fourn_ref)."'"; @@ -3886,9 +3885,9 @@ class Product extends CommonObject if ($ref_fourn) { $sql = "SELECT rowid, fk_product"; $sql .= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price"; - $sql .= " WHERE fk_soc = ".$id_fourn; + $sql .= " WHERE fk_soc = ".((int) $id_fourn); $sql .= " AND ref_fourn = '".$this->db->escape($ref_fourn)."'"; - $sql .= " AND fk_product != ".$this->id; + $sql .= " AND fk_product <> ".((int) $this->id); $sql .= " AND entity IN (".getEntity('productsupplierprice').")"; $resql = $this->db->query($sql); @@ -3918,7 +3917,7 @@ class Product extends CommonObject $obj = $this->db->fetch_object($resql); // The reference supplier does not exist, we create it for this product. - if (!$obj) { + if (empty($obj)) { $sql = "INSERT INTO ".MAIN_DB_PREFIX."product_fournisseur_price("; $sql .= "datec"; $sql .= ", entity"; @@ -3960,9 +3959,9 @@ class Product extends CommonObject // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps /** - * Renvoie la liste des fournisseurs du produit/service + * Return list of suppliers providing the product or service * - * @return array Tableau des id de fournisseur + * @return array Array of vendor ids */ public function list_suppliers() { diff --git a/test/phpunit/CommandeFournisseurTest.php b/test/phpunit/CommandeFournisseurTest.php index bebd65634bf..0ee65e3383e 100644 --- a/test/phpunit/CommandeFournisseurTest.php +++ b/test/phpunit/CommandeFournisseurTest.php @@ -130,7 +130,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase /** * testCommandeFournisseurCreate * - * @return void + * @return int ID of purchase order */ public function testCommandeFournisseurCreate() { @@ -157,11 +157,13 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase // Create 1 supplier price with min qty = 10; $result=$product->add_fournisseur($user, $societe->id, $ref_fourn, $quantity); // This insert record with no value for price. Values are update later with update_buyprice - $this->assertGreaterThanOrEqual(1, $result); + print __METHOD__." add_fournisseur result=".$result."\n"; + $this->assertGreaterThanOrEqual(0, $result, 'Create 1 supplier price with min qty = 10 if not exists'); $result=$product->update_buyprice($quantity, 20, $user, 'HT', $societe, '', $ref_fourn, $tva_tx, 0, 0); - $this->assertGreaterThanOrEqual(0, $result); + print __METHOD__." update_buyprice result=".$result."\n"; + $this->assertGreaterThanOrEqual(0, $result, 'Update buyprice'); - // Create supplier order with a too low quantity and option SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY is on + // Create purchase order with a too low quantity and option SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY is on $conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY = 1; $localobject=new CommandeFournisseur($db); @@ -182,7 +184,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase $sql="DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseur where ref=''"; $db->query($sql); - // Create supplier order + // Create purchase order $localobject2=new CommandeFournisseur($db); $localobject2->initAsSpecimen(); // This create 5 lines of first product found for socid 1 $localobject2->lines=array(); // Overwrite lines of order @@ -199,7 +201,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase $this->assertGreaterThan(0, $result); - // Create supplier order with a too low quantity but option SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY is off + // Create purchase order with a too low quantity but option SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY is off $conf->global->SUPPLIER_ORDER_WITH_PREDEFINED_PRICES_ONLY = 0; $localobject3=new CommandeFournisseur($db); @@ -220,7 +222,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase $sql="DELETE FROM ".MAIN_DB_PREFIX."commande_fournisseur where ref=''"; $db->query($sql); - // Create supplier order + // Create purchase order $localobject4=new CommandeFournisseur($db); $localobject4->initAsSpecimen(); // This create 5 lines of first product found for socid 1 $localobject4->lines=array(); // Overwrite lines of order @@ -233,9 +235,8 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase $localobject4->lines[]=$line; $result=$localobject4->create($user); - print __METHOD__." result=".$result."\n"; - $this->assertGreaterThan(0, $result); - + print __METHOD__." id for purchase order created by testCommandeFournisseurCreate = ".$result."\n"; + $this->assertGreaterThan(0, $result, 'Test to create a purchase order by testCommandeFournisseurCreate'); return $result; } @@ -244,8 +245,8 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase /** * testCommandeFournisseurFetch * - * @param int $id Id of supplier order - * @return void + * @param int $id Id of purchase order + * @return CommandeFournisseur Purchase order * * @depends testCommandeFournisseurCreate * The depends says test is run only if previous is ok @@ -270,7 +271,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase * testCommandeFournisseurValid * * @param Object $localobject Supplier order - * @return void + * @return CommandeFournisseur Supplier order * * @depends testCommandeFournisseurFetch * The depends says test is run only if previous is ok @@ -293,8 +294,8 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase /** * testCommandeFournisseurApprove * - * @param Object $localobject Supplier order - * @return void + * @param Object $localobject Supplier order + * @return CommandeFournisseur Supplier order * * @depends testCommandeFournisseurValid * The depends says test is run only if previous is ok @@ -317,8 +318,8 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase /** * testCommandeFournisseurCancel * - * @param Object $localobject Supplier order - * @return void + * @param Object $localobject Supplier order + * @return CommandeFournisseur Supplier order * * @depends testCommandeFournisseurApprove * The depends says test is run only if previous is ok @@ -342,7 +343,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase * testCommandeFournisseurOther * * @param Object $localobject Supplier order - * @return void + * @return int Id of purchase order * * @depends testCommandeFournisseurCancel * The depends says test is run only if previous is ok @@ -364,6 +365,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase print __METHOD__." localobject->date_creation=".$localobject->date_creation."\n"; $this->assertNotEquals($localobject->date_creation, ''); */ + $this->assertEquals(1, 1); return $localobject->id; } @@ -372,7 +374,7 @@ class CommandeFournisseurTest extends PHPUnit\Framework\TestCase * testCommandeFournisseurDelete * * @param int $id Id of order - * @return void + * @return int Result of delete * * @depends testCommandeFournisseurOther * The depends says test is run only if previous is ok