diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php index b78bf1ce0bd..019c5745efb 100644 --- a/htdocs/admin/stock.php +++ b/htdocs/admin/stock.php @@ -49,6 +49,10 @@ if($action) { $res = dolibarr_set_const($db, "STOCK_USERSTOCK_AUTOCREATE", GETPOST('STOCK_USERSTOCK_AUTOCREATE','alpha'),'chaine',0,'',$conf->entity); } + if ($action == 'STOCK_ALLOW_NEGATIVE_TRANSFER') + { + $res = dolibarr_set_const($db, "STOCK_ALLOW_NEGATIVE_TRANSFER", GETPOST('STOCK_ALLOW_NEGATIVE_TRANSFER','alpha'),'chaine',0,'',$conf->entity); + } // Mode of stock decrease if ($action == 'STOCK_CALCULATE_ON_BILL' || $action == 'STOCK_CALCULATE_ON_VALIDATE_ORDER' @@ -427,6 +431,22 @@ print '' print ''; print "\n"; print "\n"; + +$var=!$var; + +print ""; +print ''.$langs->trans("WarehouseAllowNegativeTransfer").''; + +print ''; +print "
"; +print ''; +print ""; +print $form->selectyesno("STOCK_ALLOW_NEGATIVE_TRANSFER",$conf->global->STOCK_ALLOW_NEGATIVE_TRANSFER,1); +print ''; +print '
'; +print "\n"; +print "\n"; + print '
'; /* I keep the option/feature, but hidden to end users for the moment. If feature is used by module, no need to have users see it. diff --git a/htdocs/core/modules/modStock.class.php b/htdocs/core/modules/modStock.class.php index 7bdf5d1d641..bc3ba80903d 100644 --- a/htdocs/core/modules/modStock.class.php +++ b/htdocs/core/modules/modStock.class.php @@ -71,7 +71,9 @@ class modStock extends DolibarrModules $this->langfiles = array("stocks"); // Constants - $this->const = array(); + $this->const = array( + 0=>array('STOCK_ALLOW_NEGATIVE_TRANSFER','chaine','1','',1) + ); // Boxes $this->boxes = array(); diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index d295e4b3451..c032e72e073 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -120,6 +120,8 @@ StockMustBeEnoughForShipment= Stock level must be enough to add product/service MovementLabel=Label of movement InventoryCode=Movement or inventory code IsInPackage=Contained into package +WarehouseAllowNegativeTransfer=Allow transfer even without stock +qtyToTranferIsNotEnough=You don't have enough stock from your source warehouse ShowWarehouse=Show warehouse MovementCorrectStock=Stock correction for product %s MovementTransferStock=Stock transfer of product %s into another warehouse diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index a19a39beb45..2a74f885c80 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -239,7 +239,7 @@ class MouvementStock extends CommonObject return -1; } } - + // TODO Check qty is ok for stock move. if (! empty($conf->productbatch->enabled) && $product->hasbatch() && ! $skip_batch) { @@ -249,6 +249,17 @@ class MouvementStock extends CommonObject { } + + if (empty($conf->global->STOCK_ALLOW_NEGATIVE_TRANSFER) && in_array($type, array(1, 2))) + { + if (empty($product->stock_warehouse[$entrepot_id]->real) || $product->stock_warehouse[$entrepot_id]->real < abs($qty)) + { + $this->error = $langs->trans('qtyToTranferIsNotEnough'); + $this->errors[] = $langs->trans('qtyToTranferIsNotEnough'); + $this->db->rollback(); + return -8; + } + } // Define if we must make the stock change (If product type is a service or if stock is used also for services) $movestock=0; diff --git a/htdocs/product/stock/product.php b/htdocs/product/stock/product.php index 9bc37ad5a7a..65454c04277 100644 --- a/htdocs/product/stock/product.php +++ b/htdocs/product/stock/product.php @@ -233,7 +233,7 @@ if ($action == "transfert_stock" && ! $cancel) $pricesrc=0; if (isset($object->pmp)) $pricesrc=$object->pmp; $pricedest=$pricesrc; - + if ($object->hasbatch()) { $pdluo = new Productbatch($db); @@ -324,6 +324,8 @@ if ($action == "transfert_stock" && ! $cancel) if ($result2 < 0) $error++; } } + + if (! $error && $result1 >= 0 && $result2 >= 0) { $db->commit();