Skip to content

Commit

Permalink
FIX if a supplier price reference is changed after creating an order, we
Browse files Browse the repository at this point in the history
can't clone order.
  • Loading branch information
eldy committed Dec 13, 2016
1 parent 95d8fae commit 43d18cd
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 30 deletions.
52 changes: 29 additions & 23 deletions htdocs/fourn/class/fournisseur.commande.class.php
Expand Up @@ -324,10 +324,10 @@ function fetch($id,$ref='')
$line->product_label = $objp->product_label;
$line->product_desc = $objp->product_desc;

$line->ref = $objp->product_ref;
$line->product_ref = $objp->product_ref;
$line->ref_fourn = $objp->ref_supplier;
$line->ref_supplier = $objp->ref_supplier;
$line->ref = $objp->product_ref; // Ref of product
$line->product_ref = $objp->product_ref; // Ref of product
$line->ref_fourn = $objp->ref_supplier; // The supplier ref of price when product was added. May have change since
$line->ref_supplier = $objp->ref_supplier; // The supplier ref of price when product was added. May have change since

$line->date_start = $this->db->jdate($objp->date_start);
$line->date_end = $this->db->jdate($objp->date_end);
Expand Down Expand Up @@ -1139,7 +1139,7 @@ function create($user, $notrigger=0)
$this->lines[$i]->localtax2_tx,
$this->lines[$i]->fk_product,
0,
$this->lines[$i]->ref_fourn,
$this->lines[$i]->ref_fourn, // $this->lines[$i]->ref_fourn comes from field ref into table of lines. Value may ba a ref that does not exists anymore, so we first try with value of product
$this->lines[$i]->remise_percent,
'HT',
0,
Expand Down Expand Up @@ -1295,7 +1295,7 @@ function createFromClone()
* @param float $txlocaltax2 Localtax2 tax
* @param int $fk_product Id product
* @param int $fk_prod_fourn_price Id supplier price
* @param string $fourn_ref Supplier reference
* @param string $fourn_ref Supplier reference price
* @param float $remise_percent Remise
* @param string $price_base_type HT or TTC
* @param float $pu_ttc Unit price TTC
Expand Down Expand Up @@ -1341,7 +1341,8 @@ function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0
$pu=$pu_ttc;
}
$desc=trim($desc);

$ref=''; // Ref of supplier price when we add line

// Check parameters
if ($qty < 1 && ! $fk_product)
{
Expand All @@ -1363,15 +1364,28 @@ function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0
$prod = new Product($this->db, $fk_product);
if ($prod->fetch($fk_product) > 0)
{
$result=$prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product, $fourn_ref); // Search on couple $fk_prod_fourn_price/$qty first, then on triplet $qty/$fk_product/$fourn_ref
$product_type = $prod->type;
$label = $prod->libelle;

// We use 'none' instead of $fourn_ref, because fourn_ref may not exists anymore. So we will take the first supplier price ok.
// If we want a dedicated supplier price, we must provide $fk_prod_fourn_price.
$result=$prod->get_buyprice($fk_prod_fourn_price, $qty, $fk_product, 'none', $this->fk_soc); // Search on couple $fk_prod_fourn_price/$qty first, then on triplet $qty/$fk_product/$fourn_ref/$this->fk_soc
if ($result > 0)
{
$label = $prod->libelle;
$pu = $prod->fourn_pu;
$ref = $prod->ref_fourn;
$product_type = $prod->type;
$pu = $prod->fourn_pu; // Unit price supplier price set by get_buyprice
$ref = $prod->ref_fourn; // Ref supplier price set by get_buyprice
}
if ($result == 0 || $result == -1)
if ($result == 0) // If result == 0, we failed to found the supplier reference price
{
$langs->load("errors");
$this->error = "Ref " . $prod->ref . " " . $langs->trans("ErrorQtyTooLowForThisSupplier");
$this->db->rollback();
dol_syslog(get_class($this)."::addline we did not found supplier price, so we can't guess unit price");
//$pu = $prod->fourn_pu; // We do not overwrite unit price
//$ref = $prod->ref_fourn; // We do not overwrite ref supplier price
return -1;
}
if ($result == -1)
{
$langs->load("errors");
$this->error = "Ref " . $prod->ref . " " . $langs->trans("ErrorQtyTooLowForThisSupplier");
Expand Down Expand Up @@ -1424,7 +1438,7 @@ function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0

$subprice = price2num($pu,'MU');

// TODO We should use here $this->line=new CommandeFournisseurLigne($this->db); and $this->line->insert(); to work loke other object (proposal, order, invoice)
// TODO We should use here $this->line=new CommandeFournisseurLigne($this->db); and $this->line->insert(); to work like other object (proposal, order, invoice)
$sql = "INSERT INTO ".MAIN_DB_PREFIX."commande_fournisseurdet";
$sql.= " (fk_commande, label, description, date_start, date_end,";
$sql.= " fk_product, product_type,";
Expand Down Expand Up @@ -2708,15 +2722,7 @@ class CommandeFournisseurLigne extends CommonOrderLine
// From llx_product_fournisseur_price

/**
* Supplier ref
* @var string
* @deprecated Use ref_supplier
* @see ref_supplier
*/
public $ref_fourn;

/**
* Supplier reference
* Supplier reference of price when we added the line. May have been changed after line was added.
* @var string
*/
public $ref_supplier;
Expand Down
10 changes: 6 additions & 4 deletions htdocs/fourn/class/fournisseur.facture.class.php
Expand Up @@ -1219,11 +1219,11 @@ function addline($desc, $pu, $txtva, $txlocaltax1, $txlocaltax2, $qty, $fk_produ
$txtva=price2num($txtva);
$txlocaltax1=price2num($txlocaltax1);
$txlocaltax2=price2num($txlocaltax2);

$ref=''; // Ref of supplier price when we add line

// Check parameters
if ($type < 0) return -1;


$this->db->begin();

$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'facture_fourn_det (fk_facture_fourn)';
Expand Down Expand Up @@ -1954,12 +1954,14 @@ class SupplierInvoiceLine extends CommonObjectLine
* @var string
*/
public $product_ref;

/**
* Reference product supplier
* TODO Rename field ref to ref_supplier into table llx_facture_fourn_det and llx_commande_fournisseurdet and update fields it into updateline
* Supplier reference of price when we added the line. May have been changed after line was added.
* TODO Rename field ref to ref_supplier into table llx_facture_fourn_det and llx_commande_fournisseurdet and update fields into updateline
* @var string
*/
public $ref_supplier;

/**
* @deprecated
* @see label
Expand Down
8 changes: 5 additions & 3 deletions htdocs/product/class/product.class.php
Expand Up @@ -1334,10 +1334,11 @@ function log_price_delete($user,$rowid)
* @param int $prodfournprice Id du tarif = rowid table product_fournisseur_price
* @param double $qty Quantity asked or -1 to get first entry found
* @param int $product_id Filter on a particular product id
* @param string $fourn_ref Filter on a supplier ref. 'none' to exclude ref in search.
* @param string $fourn_ref Filter on a supplier price ref. 'none' to exclude ref in search.
* @param int $fk_soc If of supplier
* @return int <-1 if KO, -1 if qty not enough, 0 if OK but nothing found, id_product if OK and found. May also initialize some properties like (->ref_supplier, buyprice, fourn_pu, vatrate_supplier...)
*/
function get_buyprice($prodfournprice, $qty, $product_id=0, $fourn_ref='')
function get_buyprice($prodfournprice, $qty, $product_id=0, $fourn_ref='', $fk_soc=0)
{
global $conf;
$result = 0;
Expand Down Expand Up @@ -1383,12 +1384,13 @@ function get_buyprice($prodfournprice, $qty, $product_id=0, $fourn_ref='')
}
else // If not found
{
// We do a second search by doing a select again but searching with qty and id product
// 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.tva_tx, pfp.fk_supplier_price_expression";
$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 = '".$fourn_ref."'";
if ($fk_soc > 0) $sql.= " AND pfp.fk_soc = ".$fk_soc;
if ($qty > 0) $sql.= " AND pfp.quantity <= ".$qty;
$sql.= " ORDER BY pfp.quantity DESC";
$sql.= " LIMIT 1";
Expand Down

0 comments on commit 43d18cd

Please sign in to comment.