Debug incdec option.

This commit is contained in:
Laurent Destailleur 2015-02-24 19:55:59 +01:00
parent d688db3b78
commit 89684748c5
3 changed files with 152 additions and 97 deletions

View File

@ -251,6 +251,6 @@ PriceExpressionEditorHelp4=In product/service price only: <b>#supplier_min_price
PriceMode=Price mode
PriceNumeric=Number
DefaultPrice=Default price
ComposedProductDecreaseStock=Decrease Stock for sub-product
ComposedProductDIncDecStock=Increase/Decrease stock on parent change
ComposedProduct=Sub-product
MinSupplierPrice=Minimun supplier price

View File

@ -2253,18 +2253,20 @@ class Product extends CommonObject
}
/**
* Lie un produit associe au produit/service
* Link a product/service to a parent product/service
*
* @param int $id_pere Id du produit auquel sera lie le produit a lier
* @param int $id_fils Id du produit a lier
* @param int $id_pere Id of parent product/service
* @param int $id_fils Id of child product/service
* @param int $qty Quantity
* @param int $incdec 1=Increase/decrease stock of child when parent stock increase/decrease
* @return int < 0 if KO, > 0 if OK
*/
function add_sousproduit($id_pere, $id_fils,$qty)
function add_sousproduit($id_pere, $id_fils, $qty, $incdec=1)
{
// Clean parameters
if (! is_numeric($id_pere)) $id_pere=0;
if (! is_numeric($id_fils)) $id_fils=0;
if (! is_numeric($incdec)) $incdec=0;
$result=$this->del_sousproduit($id_pere, $id_fils);
if ($result < 0) return $result;
@ -2290,8 +2292,8 @@ class Product extends CommonObject
}
else
{
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'product_association(fk_product_pere,fk_product_fils,qty)';
$sql .= ' VALUES ('.$id_pere.', '.$id_fils.', '.$qty.')';
$sql = 'INSERT INTO '.MAIN_DB_PREFIX.'product_association(fk_product_pere,fk_product_fils,qty,incdec)';
$sql .= ' VALUES ('.$id_pere.', '.$id_fils.', '.$qty.', '.$incdec.')';
if (! $this->db->query($sql))
{
dol_print_error($this->db);
@ -2309,25 +2311,25 @@ class Product extends CommonObject
/**
* Modify composed product
*
* @param int $id_pere Id of master product
* @param int $id_fils Id of linked product
* @param int $id_pere Id of parent product/service
* @param int $id_fils Id of child product/service
* @param int $qty Quantity
* @param int $incdec increase/descrease stock or not
* * @return int < 0 if KO, > 0 if OK
* @param int $incdec 1=Increase/decrease stock of child when parent stock increase/decrease
* @return int < 0 if KO, > 0 if OK
*/
function update_sousproduit($id_pere, $id_fils,$qty, $incdec=1)
function update_sousproduit($id_pere, $id_fils, $qty, $incdec=1)
{
// Clean parameters
if (! is_numeric($id_pere)) $id_pere=0;
if (! is_numeric($id_fils)) $id_fils=0;
if (! is_numeric($incdec)) $incdec=1;
if (! is_numeric($qty)) $qty=1;
$sql = 'UPDATE '.MAIN_DB_PREFIX.'product_association SET ';
$sql.= 'qty='.$qty;
$sql.= ',incdec='.$incdec;
$sql .= ' WHERE fk_product_pere='.$id_pere.' AND fk_product_fils='.$id_fils;
if (!$this->db->query($sql))
{
dol_print_error($this->db);
@ -2337,7 +2339,7 @@ class Product extends CommonObject
{
return 1;
}
}
/**
@ -2375,7 +2377,7 @@ class Product extends CommonObject
*/
function is_sousproduit($fk_parent, $fk_child)
{
$sql = "SELECT fk_product_pere, qty";
$sql = "SELECT fk_product_pere, qty, incdec";
$sql.= " FROM ".MAIN_DB_PREFIX."product_association";
$sql.= " WHERE fk_product_pere = '".$fk_parent."'";
$sql.= " AND fk_product_fils = '".$fk_child."'";
@ -2389,6 +2391,7 @@ class Product extends CommonObject
{
$obj = $this->db->fetch_object($result);
$this->is_sousproduit_qty = $obj->qty;
$this->is_sousproduit_incdec = $obj->incdec;
return true;
}
@ -2668,7 +2671,7 @@ class Product extends CommonObject
$type=(! empty($desc_pere[2]) ? $desc_pere[2] :'');
$label=(! empty($desc_pere[3]) ? $desc_pere[3] :'');
$incdec=!empty($desc_pere[4]) ? $desc_pere[4] : 0;
if ($multiply < 1) $multiply=1;
//print "XXX We add id=".$id." - label=".$label." - nb=".$nb." - multiply=".$multiply." fullpath=".$compl_path.$label."\n";

View File

@ -64,18 +64,19 @@ if ($id > 0 || ! empty($ref))
* Actions
*/
if ($cancel) $action ='';
// Action association d'un sousproduit
if ($action == 'add_prod' &&
$cancel <> $langs->trans("Cancel") &&
($user->rights->produit->creer || $user->rights->service->creer))
if ($action == 'add_prod' && ($user->rights->produit->creer || $user->rights->service->creer))
{
$error=0;
for ($i=0; $i<$_POST["max_prod"]; $i++)
{
if ($_POST["prod_id_chk".$i] > 0)
if ($_POST["prod_qty_".$i] > 0)
{
if($product->add_sousproduit($id, $_POST["prod_id_".$i],$_POST["prod_qty_".$i]) > 0)
if ($product->add_sousproduit($id, $_POST["prod_id_".$i], $_POST["prod_qty_".$i], $_POST["prod_incdec_".$i]) > 0)
{
//var_dump($id.' - '.$_POST["prod_id_".$i].' - '.$_POST["prod_qty_".$i]);exit;
$action = 'edit';
}
else
@ -109,25 +110,17 @@ $cancel <> $langs->trans("Cancel") &&
exit;
}
}
else if($action==='save_composed_product') {
else if($action==='save_composed_product')
{
$TProduct = GETPOST('TProduct', 'array');
if(!empty($TProduct)) {
foreach ($TProduct as $id_product => $row) {
if(!empty($TProduct))
{
foreach ($TProduct as $id_product => $row)
{
$product->update_sousproduit($id, $id_product,$row['qty'], isset($row['incdec']) ? 1 : 0 );
}
}
}
if ($cancel == $langs->trans("Cancel"))
{
$action = '';
header("Location: card.php?id=".$_POST["id"]);
exit;
$action='';
}
@ -255,94 +248,134 @@ if ($id > 0 || ! empty($ref))
$atleastonenotdefined=0;
print '<tr><td colspan="2">';
print $langs->trans("ProductAssociationList").'<br>';
print '<form name="formComposedProduct" action="'.$_SERVER['PHP_SELF'].'" method="post" ">';
print '<form name="formComposedProduct" action="'.$_SERVER['PHP_SELF'].'" method="post">';
print '<input type="hidden" name="action" value="save_composed_product" />';
print '<input type="hidden" name="id" value="'.$id.'" />';
print '<table class="centpercent nobordernopadding">';
print '<tr class="liste_titre"><td>'.$langs->trans('ComposedProduct').'</td><td>'.$langs->trans('Qty').'</td><td>'.$langs->trans('ComposedProductDecreaseStock').'</td><td>'.$langs->trans('MinSupplierPrice').'</td><td>'.$langs->trans('Price').'</td><td>'.$langs->trans('Stock').'</td></tr>';
print '<tr class="liste_titre">';
print '<td>'.$langs->trans('ComposedProduct').'</td>';
print '<td>'.$langs->trans('Label').'</td>';
print '<td align="right" colspan="2">'.$langs->trans('MinSupplierPrice').'</td>';
if (! empty($conf->stock->enabled)) print '<td align="right">'.$langs->trans('Stock').'</td>';
print '<td align="center">'.$langs->trans('Qty').'</td>';
print '<td align="center">'.$langs->trans('ComposedProductDIncDecStock').'</td>';
print '</tr>';
foreach($prods_arbo as $value)
{
$productstatic->id=$value['id'];
$productstatic->type=$value['type'];
$productstatic->label=$value['label'];
$class=($class=='impair')?'pair':'impair';
print '<tr class="'.$class.'">';
if ($value['level'] <= 1)
{
$notdefined=0;
$productstatic->ref=$value['fullpath'];
$productstatic->ref=$value['ref'];
$nb_of_subproduct = $value['nb'];
print '<td>'.$productstatic->getNomUrl(1,'composition').'</td>';
if($user->rights->produit->creer || $user->rights->service->creer) {
print '<td><input type="text" value="'.$nb_of_subproduct.'" name="TProduct['.$productstatic->id.'][qty]" size="4" /></td>';
print '<td><input type="checkbox" name="TProduct['.$productstatic->id.'][incdec]" value="1" '.($value['incdec']==1?'checked="checked"':'' ).' /></td>';
print '<td>'.$productstatic->label.'</td>';
// Best buying price
print '<td align="right">';
if ($product_fourn->find_min_price_product_fournisseur($productstatic->id) > 0)
{
print ' &nbsp; '.$langs->trans("BuyingPriceMinShort").': ';
if ($product_fourn->product_fourn_price_id > 0) print $product_fourn->display_price_product_fournisseur(0,0);
else { print $langs->trans("NotDefined"); $notdefined++; $atleastonenotdefined++; }
}
print '</td>';
$totalline=price2num($value['nb'] * $product_fourn->fourn_unitprice, 'MT');
$total+=$totalline;
print '<td align="right">';
print ($notdefined?'':($value['nb']> 1 ? $value['nb'].'x' : '').price($product_fourn->fourn_unitprice,'','',0,0,-1,$conf->currency));
print '</td>';
// Stock
if (! empty($conf->stock->enabled)) print '<td align="right">'.$value['stock'].'</td>'; // Real stock
// Qty + IncDec
if ($user->rights->produit->creer || $user->rights->service->creer)
{
print '<td align="center"><input type="text" value="'.$nb_of_subproduct.'" name="TProduct['.$productstatic->id.'][qty]" size="4" /></td>';
print '<td align="center"><input type="checkbox" name="TProduct['.$productstatic->id.'][incdec]" value="1" '.($value['incdec']==1?'checked="checked"':'' ).' /></td>';
}
else{
print '<td>'.$nb_of_subproduct.'</td>';
print '<td>'.($value['incdec']==1?'x':'' ).'</td>';
}
print '<td align="right">';
if ($product_fourn->find_min_price_product_fournisseur($productstatic->id) > 0)
{
print $langs->trans("BuyingPriceMinShort").': ';
if ($product_fourn->product_fourn_price_id > 0) print $product_fourn->display_price_product_fournisseur(0,0);
else { print $langs->trans("NotDefined"); $notdefined++; $atleastonenotdefined++; }
}
print '</td>';
$totalline=price2num($value['nb'] * $product_fourn->fourn_unitprice, 'MT');
$total+=$totalline;
print '<td align="right">'.($notdefined?'':price($totalline,'','',0,0,-1,$conf->currency)).'</td>';
if (! empty($conf->stock->enabled)) print '<td align="right">'.$langs->trans("Stock").': '.$value['stock'].'</td>'; // Real stock
}
else {
$productstatic->ref=$value['label'];
else
{
//$productstatic->ref=$value['label'];
$productstatic->ref=$value['ref'];
print '<td>';
for ($i=0; $i < $value['level']; $i++)
{
print ' &nbsp; &nbsp; ';
}
for ($i=0; $i < $value['level']; $i++) print ' &nbsp; &nbsp; '; // Add indentation
print $productstatic->getNomUrl(1,'composition').'</td>';
print '<td>'.$value['nb'].'</td>';
print '<td>'.$productstatic->label.'</td>';
print '<td>&nbsp;</td>';
print '<td>&nbsp;</td>';
if (! empty($conf->stock->enabled)) print '<td></td>'; // Real stock
print '<td align="center">'.$value['nb'].'</td>';
print '<td>&nbsp;</td>';
print '<td>&nbsp;<td>';
print '<td>&nbsp;<td>';
if (! empty($conf->stock->enabled)) print '<td align="right"></td>'; // Real stock
}
print '</tr>';
}
print '<tr class="liste_total">';
print '<td colspan="3" align="right">'.$langs->trans("TotalBuyingPriceMin").': ';
if ($atleastonenotdefined) print $langs->trans("Unknown").' ('.$langs->trans("SomeSubProductHaveNoPrices").')';
print '<td class="liste_total"></td>';
print '<td class="liste_total"></td>';
// Minimum buying price
print '<td class="liste_total" align="right">';
print $langs->trans("TotalBuyingPriceMin");
print '</td>';
print '<td align="right" class="liste_total">'.($atleastonenotdefined?'':price($total,'','',0,0,-1,$conf->currency)).'</td>';
print '<td class="liste_total" align="right">';
if ($atleastonenotdefined) print $langs->trans("Unknown").' ('.$langs->trans("SomeSubProductHaveNoPrices").')';
print ($atleastonenotdefined?'':price($total,'','',0,0,-1,$conf->currency));
print '</td>';
// Stock
if (! empty($conf->stock->enabled)) print '<td class="liste_total" align="right">&nbsp;</td>';
print '<td align="center">';
if ($user->rights->produit->creer || $user->rights->service->creer)
{
print '<input type="submit" class="button" value="'.$langs->trans('Save').'">';
}
print '</td>';
print '<td align="center">';
if ($user->rights->produit->creer || $user->rights->service->creer)
{
print '<input type="submit" class="button" value="'.$langs->trans('Save').'">';
}
print '</td>';
print '</tr>';
print '</table>';
if($user->rights->produit->creer || $user->rights->service->creer) {
print '<div class="tabsAction"><input type="submit" value="'.$langs->trans('Save').'" /></div>';
}
/*if($user->rights->produit->creer || $user->rights->service->creer) {
print '<input type="submit" class="button" value="'.$langs->trans('Save').'">';
}*/
print '</form>';
print '</td></tr>';
}
// Number of parent virtual products
print '<tr class="pair"><td>'.$langs->trans("ParentProductsNumber").'</td><td>';
print $form->textwithpicto(count($prodsfather), $langs->trans('IfZeroItIsNotUsedByVirtualProduct'));
print '</td>';
print '</td></tr>';
if (count($prodsfather) > 0)
{
@ -409,10 +442,11 @@ if ($id > 0 || ! empty($ref))
print '<input type="hidden" name="id" value="'.$id.'">';
print '<table class="nobordernopadding" width="100%">';
print '<tr class="liste_titre">';
print '<th class="liste_titre">'.$langs->trans("Ref").'</td>';
print '<th class="liste_titre">'.$langs->trans("ComposedProduct").'</td>';
print '<th class="liste_titre">'.$langs->trans("Label").'</td>';
print '<th class="liste_titre" align="center">'.$langs->trans("IsInPackage").'</td>';
//print '<th class="liste_titre" align="center">'.$langs->trans("IsInPackage").'</td>';
print '<th class="liste_titre" align="right">'.$langs->trans("Qty").'</td>';
print '<th align="center">'.$langs->trans('ComposedProductDIncDecStock').'</th>';
print '</tr>';
if ($resql)
{
@ -464,19 +498,37 @@ if ($id > 0 || ! empty($ref))
if ($conf->global->MAIN_MULTILANGS && $objp->labelm) $labeltoshow=$objp->labelm;
print '<td>'.$labeltoshow.'</td>';
if($product->is_sousproduit($id, $objp->rowid))
{
$addchecked = ' checked="checked"';
//$addchecked = ' checked="checked"';
$qty=$product->is_sousproduit_qty;
$incdec=$product->is_sousproduit_incdec;
}
else
{
$addchecked = '';
$qty="1";
//$addchecked = '';
$qty=0;
$incdec=0;
}
print '<td align="center"><input type="hidden" name="prod_id_'.$i.'" value="'.$objp->rowid.'">';
print '<input type="checkbox" '.$addchecked.'name="prod_id_chk'.$i.'" value="'.$objp->rowid.'"></td>';
print '<td align="right"><input type="text" size="2" name="prod_qty_'.$i.'" value="'.$qty.'"></td>';
// Contained into package
/*print '<td align="center"><input type="hidden" name="prod_id_'.$i.'" value="'.$objp->rowid.'">';
print '<input type="checkbox" '.$addchecked.'name="prod_id_chk'.$i.'" value="'.$objp->rowid.'"></td>';*/
// Qty
print '<td align="right"><input type="hidden" name="prod_id_'.$i.'" value="'.$objp->rowid.'"><input type="text" size="2" name="prod_qty_'.$i.'" value="'.($qty?$qty:'').'"></td>';
// Inc Dec
print '<td align="center">';
if ($qty) print '<input type="checkbox" name="prod_incdec_'.$i.'" value="1" '.($incdec?'checked="checked"':'').'>';
else
{
// TODO Hide field and show it when setting a qty
print '<input type="checkbox" name="prod_incdec_'.$i.'" value="1" checked="checked">';
//print '<input type="checkbox" disabled="true" name="prod_incdec_'.$i.'" value="1" checked="checked">';
}
print '</td>';
print '</tr>';
}
$i++;
@ -493,9 +545,9 @@ if ($id > 0 || ! empty($ref))
if($num > 0)
{
print '<br><div class="center">';
print '<input type="submit" class="button" value="'.$langs->trans("Add").'/'.$langs->trans("Update").'">';
print '<input type="submit" class="button" name="save" value="'.$langs->trans("Add").'/'.$langs->trans("Update").'">';
print '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
print '<input type="submit" class="button" value="'.$langs->trans("Cancel").'">';
print '<input type="submit" class="button" name="cancel" value="'.$langs->trans("Cancel").'">';
print '</div>';
}