mirror of
https://github.com/grocy/grocy.git
synced 2025-08-20 04:12:59 +00:00
Improve handling of not in-stock but valid manually entered products on the consume and transfer page (references #1429)
This commit is contained in:
@@ -28,7 +28,7 @@
|
|||||||
### Stock improvements/fixes
|
### Stock improvements/fixes
|
||||||
- Product barcodes are now enforced to be unique across products
|
- Product barcodes are now enforced to be unique across products
|
||||||
- On the stock overview page it's now also possible to search/filter by product barcodes (via the general search field)
|
- On the stock overview page it's now also possible to search/filter by product barcodes (via the general search field)
|
||||||
- The product picker on the consume page now only shows products which are currently in stock
|
- The product picker on the consume and transfer page now only shows products which are currently in stock
|
||||||
- Added a filter option to only show in-stock products on the products list page (master data)
|
- Added a filter option to only show in-stock products on the products list page (master data)
|
||||||
- Added new columns on the stock overview page (hidden by default): Product description, product default location, parent product
|
- Added new columns on the stock overview page (hidden by default): Product description, product default location, parent product
|
||||||
- Fixed that editing stock entries was not possible
|
- Fixed that editing stock entries was not possible
|
||||||
|
@@ -533,7 +533,7 @@ class StockController extends BaseController
|
|||||||
public function Transfer(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
|
public function Transfer(\Psr\Http\Message\ServerRequestInterface $request, \Psr\Http\Message\ResponseInterface $response, array $args)
|
||||||
{
|
{
|
||||||
return $this->renderPage($response, 'transfer', [
|
return $this->renderPage($response, 'transfer', [
|
||||||
'products' => $this->getDatabase()->products()->where('active = 1')->orderBy('name', 'COLLATE NOCASE'),
|
'products' => $this->getDatabase()->products()->where('active = 1')->where('id IN (SELECT product_id from stock_current WHERE amount_aggregated > 0)')->orderBy('name', 'COLLATE NOCASE'),
|
||||||
'barcodes' => $this->getDatabase()->product_barcodes_comma_separated(),
|
'barcodes' => $this->getDatabase()->product_barcodes_comma_separated(),
|
||||||
'locations' => $this->getDatabase()->locations()->orderBy('name', 'COLLATE NOCASE'),
|
'locations' => $this->getDatabase()->locations()->orderBy('name', 'COLLATE NOCASE'),
|
||||||
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
|
'quantityUnits' => $this->getDatabase()->quantity_units()->orderBy('name', 'COLLATE NOCASE'),
|
||||||
|
@@ -248,38 +248,83 @@ $('#product_id_text_input').on('blur', function(e)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Grocy.Components.ProductPicker.PopupOpen = true;
|
// The product picker contains only in-stock products on some pages,
|
||||||
bootbox.dialog({
|
// so only show the workflow dialog when the entered input
|
||||||
message: __t('"%s" could not be resolved to a product, how do you want to proceed?', input),
|
// does not match in existing product (name) or barcode,
|
||||||
title: __t('Create or assign product'),
|
// otherwise an error validation message that the product is not in stock
|
||||||
onEscape: function()
|
var existsAsProduct = false;
|
||||||
|
var existsAsBarcode = false;
|
||||||
|
Grocy.Api.Get('objects/product_barcodes?query[]=barcode=' + input,
|
||||||
|
function(barcodeResult)
|
||||||
{
|
{
|
||||||
Grocy.Components.ProductPicker.PopupOpen = false;
|
if (barcodeResult.length > 0)
|
||||||
Grocy.Components.ProductPicker.SetValue('');
|
{
|
||||||
|
existsAsProduct = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Grocy.Api.Get('objects/products?query[]=name=' + input,
|
||||||
|
function(productResult)
|
||||||
|
{
|
||||||
|
if (productResult.length > 0)
|
||||||
|
{
|
||||||
|
existsAsProduct = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!existsAsBarcode && !existsAsProduct)
|
||||||
|
{
|
||||||
|
Grocy.Components.ProductPicker.PopupOpen = true;
|
||||||
|
bootbox.dialog({
|
||||||
|
message: __t('"%s" could not be resolved to a product, how do you want to proceed?', input),
|
||||||
|
title: __t('Create or assign product'),
|
||||||
|
onEscape: function()
|
||||||
|
{
|
||||||
|
Grocy.Components.ProductPicker.PopupOpen = false;
|
||||||
|
Grocy.Components.ProductPicker.SetValue('');
|
||||||
|
},
|
||||||
|
size: 'large',
|
||||||
|
backdrop: true,
|
||||||
|
closeButton: false,
|
||||||
|
buttons: buttons
|
||||||
|
}).on('keypress', function(e)
|
||||||
|
{
|
||||||
|
if (e.key === 'B' || e.key === 'b')
|
||||||
|
{
|
||||||
|
$('.add-new-barcode-dialog-button').not(".d-none").click();
|
||||||
|
}
|
||||||
|
if (e.key === 'p' || e.key === 'P')
|
||||||
|
{
|
||||||
|
$('.add-new-product-dialog-button').not(".d-none").click();
|
||||||
|
}
|
||||||
|
if (e.key === 'a' || e.key === 'A')
|
||||||
|
{
|
||||||
|
$('.add-new-product-with-barcode-dialog-button').not(".d-none").click();
|
||||||
|
}
|
||||||
|
if (e.key === 'c' || e.key === 'C')
|
||||||
|
{
|
||||||
|
$('.retry-camera-scanning-button').not(".d-none").click();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Grocy.Components.ProductAmountPicker.Reset();
|
||||||
|
Grocy.Components.ProductPicker.Clear();
|
||||||
|
Grocy.FrontendHelpers.ValidateForm('consume-form');
|
||||||
|
Grocy.Components.ProductPicker.ShowCustomError(__t('This product is not in stock'));
|
||||||
|
Grocy.Components.ProductPicker.GetInputElement().focus();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function(xhr)
|
||||||
|
{
|
||||||
|
console.error(xhr);
|
||||||
|
}
|
||||||
|
);
|
||||||
},
|
},
|
||||||
size: 'large',
|
function(xhr)
|
||||||
backdrop: true,
|
|
||||||
closeButton: false,
|
|
||||||
buttons: buttons
|
|
||||||
}).on('keypress', function(e)
|
|
||||||
{
|
|
||||||
if (e.key === 'B' || e.key === 'b')
|
|
||||||
{
|
{
|
||||||
$('.add-new-barcode-dialog-button').not(".d-none").click();
|
console.error(xhr);
|
||||||
}
|
}
|
||||||
if (e.key === 'p' || e.key === 'P')
|
);
|
||||||
{
|
|
||||||
$('.add-new-product-dialog-button').not(".d-none").click();
|
|
||||||
}
|
|
||||||
if (e.key === 'a' || e.key === 'A')
|
|
||||||
{
|
|
||||||
$('.add-new-product-with-barcode-dialog-button').not(".d-none").click();
|
|
||||||
}
|
|
||||||
if (e.key === 'c' || e.key === 'C')
|
|
||||||
{
|
|
||||||
$('.retry-camera-scanning-button').not(".d-none").click();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -419,20 +419,9 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
|
|||||||
$("#tare-weight-handling-info").addClass("d-none");
|
$("#tare-weight-handling-info").addClass("d-none");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((parseFloat(productDetails.stock_amount_aggregated) || 0) === 0)
|
Grocy.Components.ProductPicker.HideCustomError();
|
||||||
{
|
Grocy.FrontendHelpers.ValidateForm('consume-form');
|
||||||
Grocy.Components.ProductAmountPicker.Reset();
|
$('#display_amount').focus();
|
||||||
Grocy.Components.ProductPicker.Clear();
|
|
||||||
Grocy.FrontendHelpers.ValidateForm('consume-form');
|
|
||||||
Grocy.Components.ProductPicker.ShowCustomError(__t('This product is not in stock'));
|
|
||||||
Grocy.Components.ProductPicker.GetInputElement().focus();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Grocy.Components.ProductPicker.HideCustomError();
|
|
||||||
Grocy.FrontendHelpers.ValidateForm('consume-form');
|
|
||||||
$('#display_amount').focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (productDetails.stock_amount == productDetails.stock_amount_opened || productDetails.product.enable_tare_weight_handling == 1)
|
if (productDetails.stock_amount == productDetails.stock_amount_opened || productDetails.product.enable_tare_weight_handling == 1)
|
||||||
{
|
{
|
||||||
|
@@ -249,19 +249,9 @@ Grocy.Components.ProductPicker.GetPicker().on('change', function(e)
|
|||||||
|
|
||||||
$('#display_amount').attr("data-stock-amount", productDetails.stock_amount);
|
$('#display_amount').attr("data-stock-amount", productDetails.stock_amount);
|
||||||
|
|
||||||
if ((parseFloat(productDetails.stock_amount) || 0) === 0)
|
Grocy.Components.ProductPicker.HideCustomError();
|
||||||
{
|
Grocy.FrontendHelpers.ValidateForm('transfer-form');
|
||||||
Grocy.Components.ProductPicker.Clear();
|
$('#display_amount').focus();
|
||||||
Grocy.FrontendHelpers.ValidateForm('transfer-form');
|
|
||||||
Grocy.Components.ProductPicker.ShowCustomError(__t('This product is not in stock'));
|
|
||||||
Grocy.Components.ProductPicker.GetInputElement().focus();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Grocy.Components.ProductPicker.HideCustomError();
|
|
||||||
Grocy.FrontendHelpers.ValidateForm('transfer-form');
|
|
||||||
$('#display_amount').focus();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
function(xhr)
|
function(xhr)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user