diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php
index 13e5a502e29..ff132af2b29 100644
--- a/htdocs/admin/stock.php
+++ b/htdocs/admin/stock.php
@@ -457,13 +457,13 @@ print ''."\n";
print '
';
-print '| '.$langs->trans("WarehouseAllowNegativeTransfer").' | ';
+print ''.$langs->trans("WarehouseDisallowNegativeTransfer").' | ';
print '';
if ($conf->use_javascript_ajax) {
- print ajax_constantonoff('STOCK_ALLOW_NEGATIVE_TRANSFER');
+ print ajax_constantonoff('STOCK_DISALLOW_NEGATIVE_TRANSFER');
} else {
$arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
- print $form->selectarray("STOCK_ALLOW_NEGATIVE_TRANSFER", $arrval, getDolGlobalString('STOCK_ALLOW_NEGATIVE_TRANSFER'));
+ print $form->selectarray("STOCK_DISALLOW_NEGATIVE_TRANSFER", $arrval, getDolGlobalString('STOCK_DISALLOW_NEGATIVE_TRANSFER'));
}
print " | \n";
print "
\n";
diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php
index 649e2754a5e..33dee0b2f3e 100644
--- a/htdocs/compta/facture/class/facture.class.php
+++ b/htdocs/compta/facture/class/facture.class.php
@@ -3496,7 +3496,7 @@ class Facture extends CommonInvoice
$sortorder = 'ASC,ASC,ASC,ASC';
}
- $resBatchList = $productbatch->findAllForProduct($productStatic->id, $idwarehouse, (getDolGlobalInt('STOCK_ALLOW_NEGATIVE_TRANSFER') ? null : 0), $sortfield, $sortorder);
+ $resBatchList = $productbatch->findAllForProduct($productStatic->id, $idwarehouse, (getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER') ? 0 : null), $sortfield, $sortorder);
if (!is_array($resBatchList)) {
$error++;
$this->error = $this->db->lasterror();
@@ -3540,7 +3540,13 @@ class Facture extends CommonInvoice
}
if (!$error && $product_qty_remain > 0) {
- if (getDolGlobalInt('STOCK_ALLOW_NEGATIVE_TRANSFER')) {
+ if (getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
+ $error++;
+ $langs->load('errors');
+ $warehouseStatic->fetch($idwarehouse);
+ $this->error = $langs->trans('ErrorBatchNoFoundEnoughQuantityForProductInWarehouse', $productStatic->label, $warehouseStatic->ref);
+ dol_syslog(__METHOD__.' Error: '.$langs->transnoentitiesnoconv('ErrorBatchNoFoundEnoughQuantityForProductInWarehouse', $productStatic->label, $warehouseStatic->ref), LOG_ERR);
+ } else {
// take in the first batch
$batch = $batchList[0];
$result = $mouvP->livraison($user, $productStatic->id, $idwarehouse, $product_qty_remain, $this->lines[$i]->subprice, $langs->trans('InvoiceValidatedInDolibarr', $num), '', '', '', $batch->batch);
@@ -3549,12 +3555,6 @@ class Facture extends CommonInvoice
$this->error = $mouvP->error;
$this->errors = array_merge($this->errors, $mouvP->errors);
}
- } else {
- $error++;
- $langs->load('errors');
- $warehouseStatic->fetch($idwarehouse);
- $this->error = $langs->trans('ErrorBatchNoFoundEnoughQuantityForProductInWarehouse', $productStatic->label, $warehouseStatic->ref);
- dol_syslog(__METHOD__.' Error: '.$langs->transnoentitiesnoconv('ErrorBatchNoFoundEnoughQuantityForProductInWarehouse', $productStatic->label, $warehouseStatic->ref), LOG_ERR);
}
}
}
diff --git a/htdocs/core/modules/modStock.class.php b/htdocs/core/modules/modStock.class.php
index 6f7aef10ebb..34365f2d71f 100644
--- a/htdocs/core/modules/modStock.class.php
+++ b/htdocs/core/modules/modStock.class.php
@@ -78,7 +78,7 @@ class modStock extends DolibarrModules
$this->const = array();
$r = 0;
- $this->const[$r] = array('STOCK_ALLOW_NEGATIVE_TRANSFER', 'chaine', '1', '', 1);
+ $this->const[$r] = array('STOCK_DISALLOW_NEGATIVE_TRANSFER', 'chaine', '1', '', 0);
$r++;
$this->const[$r][0] = "STOCK_ADDON_PDF";
diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php
index 67e483239ae..468f79f9a9d 100644
--- a/htdocs/expedition/card.php
+++ b/htdocs/expedition/card.php
@@ -1388,7 +1388,7 @@ if ($action == 'create') {
print '';
$stockMin = false;
- if (!getDolGlobalInt('STOCK_ALLOW_NEGATIVE_TRANSFER')) {
+ if (getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
$stockMin = 0;
}
if ($product->stockable_product == Product::ENABLED_STOCK) {
@@ -1568,7 +1568,7 @@ if ($action == 'create') {
$nbofsuggested = 0;
foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
- if ($stock_warehouse->real > 0 || !empty($conf->global->STOCK_ALLOW_NEGATIVE_TRANSFER)) {
+ if ($stock_warehouse->real > 0 || !getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
$nbofsuggested++;
}
}
@@ -1581,7 +1581,7 @@ if ($action == 'create') {
}
$tmpwarehouseObject->fetch($warehouse_id);
- if ($stock_warehouse->real > 0 || !empty($conf->global->STOCK_ALLOW_NEGATIVE_TRANSFER)) {
+ if ($stock_warehouse->real > 0 || !getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
$stock = + $stock_warehouse->real; // Convert it to number
$deliverableQty = min($quantityToBeDelivered, $stock);
$deliverableQty = max(0, $deliverableQty);
@@ -1699,7 +1699,7 @@ if ($action == 'create') {
// Define nb of lines suggested for this order line
$nbofsuggested = 0;
foreach ($product->stock_warehouse as $warehouse_id => $stock_warehouse) {
- if (($stock_warehouse->real > 0 || !empty($conf->global->STOCK_ALLOW_NEGATIVE_TRANSFER)) && (count($stock_warehouse->detail_batch))) {
+ if (($stock_warehouse->real > 0 || !getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (count($stock_warehouse->detail_batch))) {
$nbofsuggested += count($stock_warehouse->detail_batch);
}
}
@@ -1712,7 +1712,7 @@ if ($action == 'create') {
}
$tmpwarehouseObject->fetch($warehouse_id);
- if (($stock_warehouse->real > 0 || !empty($conf->global->STOCK_ALLOW_NEGATIVE_TRANSFER)) && (count($stock_warehouse->detail_batch))) {
+ if (($stock_warehouse->real > 0 || !getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) && (count($stock_warehouse->detail_batch))) {
foreach ($stock_warehouse->detail_batch as $dbatch) {
$batchStock = + $dbatch->qty; // To get a numeric
if (isset($alreadyQtyBatchSetted[$line->fk_product][$dbatch->batch][intval($warehouse_id)])) {
@@ -1811,7 +1811,7 @@ if ($action == 'create') {
$disabled = '';
}
print ' ';
- if (empty($disabled) && getDolGlobalString('STOCK_ALLOW_NEGATIVE_TRANSFER')) {
+ if (empty($disabled) && !getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
print '';
}
} elseif ($line->product_type == Product::TYPE_SERVICE && getDolGlobalString('SHIPMENT_SUPPORTS_SERVICES')) {
@@ -1823,7 +1823,7 @@ if ($action == 'create') {
$disabled = 'disabled="disabled"';
}
print ' ';
- if (empty($disabled) && getDolGlobalString('STOCK_ALLOW_NEGATIVE_TRANSFER')) {
+ if (empty($disabled) && !getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
print '';
}
} else {
diff --git a/htdocs/install/mysql/migration/21.0.0-22.0.0.sql b/htdocs/install/mysql/migration/21.0.0-22.0.0.sql
index cc523d9706f..63f2047b1de 100644
--- a/htdocs/install/mysql/migration/21.0.0-22.0.0.sql
+++ b/htdocs/install/mysql/migration/21.0.0-22.0.0.sql
@@ -199,3 +199,8 @@ ALTER TABLE llx_session ADD COLUMN date_creation datetime NOT NULL AFTER session
ALTER TABLE llx_accounting_account ADD COLUMN centralized tinyint DEFAULT 0 NOT NULL AFTER active;
UPDATE llx_accounting_account as acc SET acc.centralized = 1 WHERE acc.account_number in (SELECT value FROM llx_const WHERE name IN (__ENCRYPT('ACCOUNTING_ACCOUNT_CUSTOMER')__,__ENCRYPT('ACCOUNTING_ACCOUNT_SUPPLIER')__,__ENCRYPT('SALARIES_ACCOUNTING_ACCOUNT_PAYMENT')__));
+
+-- invert constant STOCK_ALLOW_NEGATIVE_TRANSFER because it was automatically set to 1, deleting the user config.
+INSERT INTO llx_const (name, entity, value, type, visible, note) SELECT DISTINCT 'STOCK_DISALLOW_NEGATIVE_TRANSFER', entity, 1, 'chaine', 0, '' FROM llx_const c1 WHERE NOT EXISTS (SELECT rowid FROM llx_const c2 WHERE c2.name = 'STOCK_ALLOW_NEGATIVE_TRANSFER' AND c2.value = 1 AND c2.entity = c1.entity);
+UPDATE llx_const SET name = 'STOCK_DISALLOW_NEGATIVE_TRANSFER', value = 1 WHERE name = 'STOCK_ALLOW_NEGATIVE_TRANSFER' AND value = 0;
+DELETE FROM llx_const WHERE name = 'STOCK_ALLOW_NEGATIVE_TRANSFER' AND value = 1;
diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang
index c4db641d941..d1879972abe 100644
--- a/htdocs/langs/en_US/stocks.lang
+++ b/htdocs/langs/en_US/stocks.lang
@@ -160,7 +160,7 @@ TypeMovement=Direction of movement
DateMovement=Date of movement
InventoryCode=Movement or inventory code
IsInPackage=Contained into package
-WarehouseAllowNegativeTransfer=Stock can be negative
+WarehouseDisallowNegativeTransfer=Stock can't be negative
qtyToTranferIsNotEnough=You don't have enough stock from your source warehouse and your setup does not allow negative stocks.
qtyToTranferLotIsNotEnough=You don't have enough stock, for this lot number, from your source warehouse and your setup does not allow negative stocks (Qty for product '%s' with lot '%s' is %s in warehouse '%s').
ShowWarehouse=Show warehouse
diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php
index cddd0044fe8..fdc95cc4f52 100644
--- a/htdocs/product/stock/class/mouvementstock.class.php
+++ b/htdocs/product/stock/class/mouvementstock.class.php
@@ -449,7 +449,7 @@ class MouvementStock extends CommonObject
// Check if stock is enough when qty is < 0.
// THIS MUST BE DONE AT END OF MOVEMENTS
// Note that qty should be > 0 with type 0 or 3, < 0 with type 1 or 2.
- if ($movestock && $qty < 0 && !getDolGlobalInt('STOCK_ALLOW_NEGATIVE_TRANSFER')) {
+ if ($movestock && $qty < 0 && getDolGlobalInt('STOCK_DISALLOW_NEGATIVE_TRANSFER')) {
if (isModEnabled('productbatch') && $product->hasbatch() && !$skip_batch) {
$foundforbatch = 0;
$qtyisnotenough = 0;