diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php
index 6fc37f45734..134aeb663b4 100644
--- a/htdocs/admin/stock.php
+++ b/htdocs/admin/stock.php
@@ -483,13 +483,15 @@ if ($virtualdiffersfromphysical)
print ''."\n";
print '
';
- print ''.$langs->trans("UseVirtualStockByDefault").' ';
+ print '';
+ print $form->textwithpicto($langs->trans("UseRealStockByDefault"), $langs->trans("ReplenishmentCalculation"));
+ print ' ';
print '';
if ($conf->use_javascript_ajax) {
- print ajax_constantonoff('STOCK_USE_VIRTUAL_STOCK');
+ print ajax_constantonoff('STOCK_USE_REAL_STOCK_BY_DEFAULT_FOR_REPLENISHMENT');
} else {
$arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
- print $form->selectarray("STOCK_USE_VIRTUAL_STOCK", $arrval, $conf->global->STOCK_USE_VIRTUAL_STOCK);
+ print $form->selectarray("STOCK_USE_REAL_STOCK_BY_DEFAULT_FOR_REPLENISHMENT", $arrval, $conf->global->STOCK_USE_REAL_STOCK_BY_DEFAULT_FOR_REPLENISHMENT);
}
print " \n";
print " \n";
diff --git a/htdocs/bom/class/bom.class.php b/htdocs/bom/class/bom.class.php
index b838aac8cd9..192acc22d83 100644
--- a/htdocs/bom/class/bom.class.php
+++ b/htdocs/bom/class/bom.class.php
@@ -92,8 +92,10 @@ class BOM extends CommonObject
'entity' => array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'notnull'=> 1, 'default'=>1, 'index'=>1, 'position'=>5),
'ref' => array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'noteditable'=>1, 'visible'=>4, 'position'=>10, 'notnull'=>1, 'default'=>'(PROV)', 'index'=>1, 'searchall'=>1, 'comment'=>"Reference of BOM", 'showoncombobox'=>'1',),
'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'enabled'=>1, 'visible'=>1, 'position'=>30, 'notnull'=>1, 'searchall'=>1, 'showoncombobox'=>'1', 'autofocusoncreate'=>1),
- 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>-1, 'position'=>60, 'notnull'=>-1,),
+ //'bomtype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>1, 'position'=>10, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing', 1=>'Disassembly')),
+ 'bomtype' => array('type'=>'integer', 'label'=>'Type', 'enabled'=>1, 'visible'=>-1, 'position'=>32, 'notnull'=>1, 'default'=>'0', 'arrayofkeyval'=>array(0=>'Manufacturing')),
'fk_product' => array('type'=>'integer:Product:product/class/product.class.php:1:(finished IS NULL or finished <> 0)', 'label'=>'Product', 'enabled'=>1, 'visible'=>1, 'position'=>35, 'notnull'=>1, 'index'=>1, 'help'=>'ProductBOMHelp'),
+ 'description' => array('type'=>'text', 'label'=>'Description', 'enabled'=>1, 'visible'=>-1, 'position'=>60, 'notnull'=>-1,),
'qty' => array('type'=>'real', 'label'=>'Quantity', 'enabled'=>1, 'visible'=>1, 'default'=>1, 'position'=>55, 'notnull'=>1, 'isameasure'=>'1', 'css'=>'maxwidth75imp'),
//'efficiency' => array('type'=>'real', 'label'=>'ManufacturingEfficiency', 'enabled'=>1, 'visible'=>-1, 'default'=>1, 'position'=>100, 'notnull'=>0, 'css'=>'maxwidth50imp', 'help'=>'ValueOfMeansLossForProductProduced'),
'duration' => array('type'=>'duration', 'label'=>'EstimatedDuration', 'enabled'=>1, 'visible'=>-1, 'position'=>101, 'notnull'=>-1, 'css'=>'maxwidth50imp', 'help'=>'EstimatedDurationDesc'),
@@ -113,6 +115,7 @@ class BOM extends CommonObject
public $rowid;
public $ref;
public $label;
+ public $bomtype;
public $description;
public $note_public;
public $note_private;
diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang
index ac97c24085c..d2c1b2cb382 100644
--- a/htdocs/langs/en_US/stocks.lang
+++ b/htdocs/langs/en_US/stocks.lang
@@ -34,7 +34,7 @@ StockMovementForId=Movement ID %d
ListMouvementStockProject=List of stock movements associated to project
StocksArea=Warehouses area
AllWarehouses=All warehouses
-IncludeEmptyDesiredStock=Include also undefined desired stock
+IncludeEmptyDesiredStock=Include also negative stock with undefined desired stock
IncludeAlsoDraftOrders=Include also draft orders
Location=Location
LocationSummary=Short name location
@@ -122,8 +122,9 @@ DesiredStockDesc=This stock amount will be the value used to fill the stock by r
StockToBuy=To order
Replenishment=Replenishment
ReplenishmentOrders=Replenishment orders
-VirtualDiffersFromPhysical=According to increase/decrease stock options, physical stock and virtual stock (physical + current orders) may differ
-UseVirtualStockByDefault=Use virtual stock by default, instead of physical stock, for replenishment feature
+VirtualDiffersFromPhysical=According to increase/decrease stock options, physical stock and virtual stock (physical stock + open orders) may differ
+UseRealStockByDefault=Use real stock, instead of virtual stock, for replenishment feature
+ReplenishmentCalculation=Amount to order will be (desired quantity - real stock) instead of (desired quantity - virtual stock)
UseVirtualStock=Use virtual stock
UsePhysicalStock=Use physical stock
CurentSelectionMode=Current selection mode
diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php
index 0fd5a658a0b..4fb8e24370c 100644
--- a/htdocs/product/stock/replenish.php
+++ b/htdocs/product/stock/replenish.php
@@ -80,7 +80,6 @@ if (!$sortorder) {
$sortorder = 'ASC';
}
-// Define virtualdiffersfromphysical
$virtualdiffersfromphysical = 0;
if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)
|| !empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)
@@ -92,7 +91,11 @@ if (!empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT)
$virtualdiffersfromphysical = 1; // According to increase/decrease stock options, virtual and physical stock may differs.
}
-$usevirtualstock = !empty($conf->global->STOCK_USE_VIRTUAL_STOCK);
+if ($virtualdiffersfromphysical) {
+ $usevirtualstock = empty($conf->global->STOCK_USE_REAL_STOCK_BY_DEFAULT_FOR_REPLENISHMENT) ? 1 : 0;
+} else {
+ $usevirtualstock = 0;
+}
if ($mode == 'physical') $usevirtualstock = 0;
if ($mode == 'virtual') $usevirtualstock = 1;
@@ -349,7 +352,9 @@ if (dol_strlen($type)) {
if ($search_ref) $sql .= natural_search('p.ref', $search_ref);
if ($search_label) $sql .= natural_search('p.label', $search_label);
$sql .= ' AND p.tobuy = 1';
-if (!empty($canvas)) $sql .= ' AND p.canvas = "'.$db->escape($canvas).'"';
+if (empty($conf->global->VARIANT_ALLOW_STOCK_MOVEMENT_ON_VARIANT_PARENT)) { // Add test to exclude products that has variants
+ $sql .= ' AND p.rowid NOT IN (SELECT pac.fk_product_parent FROM '.MAIN_DB_PREFIX.'product_attribute_combination as pac WHERE pac.entity IN ('.getEntity('product').'))';
+}
$sql .= ' GROUP BY p.rowid, p.ref, p.label, p.description, p.price';
$sql .= ', p.price_ttc, p.price_base_type,p.fk_product_type, p.tms';
$sql .= ', p.duration, p.tobuy';
@@ -526,22 +531,23 @@ print load_fiche_titre($langs->trans('Replenishment'), '', 'stock');
print dol_get_fiche_head($head, 'replenish', '', -1, '');
-print ''; // You can use div-table-responsive-no-min if you dont need reserved height for your table
if (!empty($conf->global->REPLENISH_ALLOW_VARIABLESIZELIST)) {
@@ -664,7 +651,7 @@ if (!empty($conf->global->REPLENISH_ALLOW_VARIABLESIZELIST)) {
'',
$num,
$nbtotalofrecords,
- 'object_stock.png',
+ '',
0,
'',
'',
@@ -681,7 +668,7 @@ if (!empty($conf->global->REPLENISH_ALLOW_VARIABLESIZELIST)) {
'',
$num,
$nbtotalofrecords,
- 'object_stock.png'
+ ''
);
}
@@ -830,67 +817,64 @@ while ($i < ($limit ? min($num, $limit) : $num))
$picto = img_picto($langs->trans("NoPendingReceptionOnSupplierOrder"), 'help');
}
- $variants = $prod->hasVariants();
- if (!$variants || !empty($conf->global->VARIANT_ALLOW_STOCK_MOVEMENT_ON_VARIANT_PARENT)) {
- print '
';
+ print ' ';
- // Select field
- print ' ';
+ // Select field
+ print ' ';
- print ''.$prod->getNomUrl(1, 'stock').' ';
+ print ''.$prod->getNomUrl(1, 'stock').' ';
- print ''.$objp->label;
- print ' '; // TODO Remove this and make a fetch to get description when creating order instead of a GETPOST
- print ' ';
+ print ''.$objp->label;
+ print ' '; // TODO Remove this and make a fetch to get description when creating order instead of a GETPOST
+ print ' ';
- if (!empty($conf->service->enabled) && $type == 1)
- {
- $regs = array();
- if (preg_match('/([0-9]+)y/i', $objp->duration, $regs)) {
- $duration = $regs[1].' '.$langs->trans('DurationYear');
- } elseif (preg_match('/([0-9]+)m/i', $objp->duration, $regs)) {
- $duration = $regs[1].' '.$langs->trans('DurationMonth');
- } elseif (preg_match('/([0-9]+)d/i', $objp->duration, $regs)) {
- $duration = $regs[1].' '.$langs->trans('DurationDay');
- } else {
- $duration = $objp->duration;
- }
- print ''.$duration.' ';
+ if (!empty($conf->service->enabled) && $type == 1)
+ {
+ $regs = array();
+ if (preg_match('/([0-9]+)y/i', $objp->duration, $regs)) {
+ $duration = $regs[1].' '.$langs->trans('DurationYear');
+ } elseif (preg_match('/([0-9]+)m/i', $objp->duration, $regs)) {
+ $duration = $regs[1].' '.$langs->trans('DurationMonth');
+ } elseif (preg_match('/([0-9]+)d/i', $objp->duration, $regs)) {
+ $duration = $regs[1].' '.$langs->trans('DurationDay');
+ } else {
+ $duration = $objp->duration;
}
-
- // Desired stock
- print ''.($fk_entrepot > 0 ? $desiredstockwarehouse : $desiredstock).' ';
-
- // Limit stock for alert
- print ''.($fk_entrepot > 0 ? $alertstockwarehouse : $alertstock).' ';
-
- // Current stock (all warehouses)
- print ''.$warning.$stock.' ';
-
- // Current stock (warehouse selected only)
- if (!empty($conf->global->STOCK_ALLOW_ADD_LIMIT_STOCK_BY_WAREHOUSE) && $fk_entrepot > 0)
- {
- print ''.$warningwarehouse.$stockwarehouse.' ';
- }
-
- // Already ordered
- print ''.$ordered.' '.$picto.' ';
-
- // To order
- print ' ';
-
- // Supplier
- print '';
- print $form->select_product_fourn_price($prod->id, 'fourn'.$i, $fk_supplier);
- print ' ';
-
- // Fields from hook
- $parameters = array('objp'=>$objp);
- $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
- print $hookmanager->resPrint;
-
- print ' ';
+ print '
'.$duration.' ';
}
+
+ // Desired stock
+ print '
'.($fk_entrepot > 0 ? $desiredstockwarehouse : $desiredstock).' ';
+
+ // Limit stock for alert
+ print '
'.($fk_entrepot > 0 ? $alertstockwarehouse : $alertstock).' ';
+
+ // Current stock (all warehouses)
+ print '
'.$warning.$stock.' ';
+
+ // Current stock (warehouse selected only)
+ if (!empty($conf->global->STOCK_ALLOW_ADD_LIMIT_STOCK_BY_WAREHOUSE) && $fk_entrepot > 0)
+ {
+ print '
'.$warningwarehouse.$stockwarehouse.' ';
+ }
+
+ // Already ordered
+ print '
'.$ordered.' '.$picto.'';
+
+ // To order
+ print '
';
+
+ // Supplier
+ print '
';
+ print $form->select_product_fourn_price($prod->id, 'fourn'.$i, $fk_supplier);
+ print ' ';
+
+ // Fields from hook
+ $parameters = array('objp'=>$objp);
+ $reshook = $hookmanager->executeHooks('printFieldListValue', $parameters); // Note that $action and $object may have been modified by hook
+ print $hookmanager->resPrint;
+
+ print '';
}
$i++;
}