mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 16:34:46 +00:00
fix: skip already selected serials in sr selector
This commit is contained in:
committed by
Ankush Menat
parent
5ec27c9055
commit
0a533d6ccc
@@ -94,6 +94,7 @@ erpnext.SerialNoBatchSelector = class SerialNoBatchSelector {
|
|||||||
description: __('Fetch Serial Numbers based on FIFO'),
|
description: __('Fetch Serial Numbers based on FIFO'),
|
||||||
click: () => {
|
click: () => {
|
||||||
let qty = this.dialog.fields_dict.qty.get_value();
|
let qty = this.dialog.fields_dict.qty.get_value();
|
||||||
|
let already_selected_serial_nos = get_selected_serial_nos(me);
|
||||||
let numbers = frappe.call({
|
let numbers = frappe.call({
|
||||||
method: "erpnext.stock.doctype.serial_no.serial_no.auto_fetch_serial_number",
|
method: "erpnext.stock.doctype.serial_no.serial_no.auto_fetch_serial_number",
|
||||||
args: {
|
args: {
|
||||||
@@ -101,7 +102,8 @@ erpnext.SerialNoBatchSelector = class SerialNoBatchSelector {
|
|||||||
item_code: me.item_code,
|
item_code: me.item_code,
|
||||||
warehouse: typeof me.warehouse_details.name == "string" ? me.warehouse_details.name : '',
|
warehouse: typeof me.warehouse_details.name == "string" ? me.warehouse_details.name : '',
|
||||||
batch_nos: me.item.batch_no || null,
|
batch_nos: me.item.batch_no || null,
|
||||||
posting_date: me.frm.doc.posting_date || me.frm.doc.transaction_date
|
posting_date: me.frm.doc.posting_date || me.frm.doc.transaction_date,
|
||||||
|
exclude_sr_nos: already_selected_serial_nos
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -577,15 +579,29 @@ function get_pending_qty_fields(me) {
|
|||||||
return pending_qty_fields;
|
return pending_qty_fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
function calc_total_selected_qty(me) {
|
// get all items with same item code except row for which selector is open.
|
||||||
|
function get_rows_with_same_item_code(me) {
|
||||||
const { frm: { doc: { items }}, item: { name, item_code }} = me;
|
const { frm: { doc: { items }}, item: { name, item_code }} = me;
|
||||||
const totalSelectedQty = items
|
return items.filter(item => (item.name !== name) && (item.item_code === item_code))
|
||||||
.filter( item => ( item.name !== name ) && ( item.item_code === item_code ) )
|
}
|
||||||
.map( item => flt(item.qty) )
|
|
||||||
.reduce( (i, j) => i + j, 0);
|
function calc_total_selected_qty(me) {
|
||||||
|
const totalSelectedQty = get_rows_with_same_item_code(me)
|
||||||
|
.map(item => flt(item.qty))
|
||||||
|
.reduce((i, j) => i + j, 0);
|
||||||
return totalSelectedQty;
|
return totalSelectedQty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function get_selected_serial_nos(me) {
|
||||||
|
const selected_serial_nos = get_rows_with_same_item_code(me)
|
||||||
|
.map(item => item.serial_no)
|
||||||
|
.filter(serial => serial)
|
||||||
|
.map(sr_no_string => sr_no_string.split('\n'))
|
||||||
|
.reduce((acc, arr) => acc.concat(arr), [])
|
||||||
|
.filter(serial => serial);
|
||||||
|
return selected_serial_nos;
|
||||||
|
};
|
||||||
|
|
||||||
function check_can_calculate_pending_qty(me) {
|
function check_can_calculate_pending_qty(me) {
|
||||||
const { frm: { doc }, item } = me;
|
const { frm: { doc }, item } = me;
|
||||||
const docChecks = doc.bom_no
|
const docChecks = doc.bom_no
|
||||||
|
|||||||
@@ -564,9 +564,15 @@ def get_delivery_note_serial_no(item_code, qty, delivery_note):
|
|||||||
return serial_nos
|
return serial_nos
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def auto_fetch_serial_number(qty, item_code, warehouse, posting_date=None, batch_nos=None, for_doctype=None):
|
def auto_fetch_serial_number(qty, item_code, warehouse,
|
||||||
|
posting_date=None, batch_nos=None, for_doctype=None, exclude_sr_nos=None):
|
||||||
filters = { "item_code": item_code, "warehouse": warehouse }
|
filters = { "item_code": item_code, "warehouse": warehouse }
|
||||||
|
|
||||||
|
if exclude_sr_nos is None:
|
||||||
|
exclude_sr_nos = []
|
||||||
|
else:
|
||||||
|
exclude_sr_nos = get_serial_nos(clean_serial_no_string("\n".join(exclude_sr_nos)))
|
||||||
|
|
||||||
if batch_nos:
|
if batch_nos:
|
||||||
try:
|
try:
|
||||||
filters["batch_no"] = json.loads(batch_nos) if (type(json.loads(batch_nos)) == list) else [json.loads(batch_nos)]
|
filters["batch_no"] = json.loads(batch_nos) if (type(json.loads(batch_nos)) == list) else [json.loads(batch_nos)]
|
||||||
@@ -578,10 +584,9 @@ def auto_fetch_serial_number(qty, item_code, warehouse, posting_date=None, batch
|
|||||||
|
|
||||||
serial_numbers = []
|
serial_numbers = []
|
||||||
if for_doctype == 'POS Invoice':
|
if for_doctype == 'POS Invoice':
|
||||||
reserved_sr_nos = get_pos_reserved_serial_nos(filters)
|
exclude_sr_nos.extend(get_pos_reserved_serial_nos(filters))
|
||||||
serial_numbers = fetch_serial_numbers(filters, qty, do_not_include=reserved_sr_nos)
|
|
||||||
else:
|
serial_numbers = fetch_serial_numbers(filters, qty, do_not_include=exclude_sr_nos)
|
||||||
serial_numbers = fetch_serial_numbers(filters, qty)
|
|
||||||
|
|
||||||
return [d.get('name') for d in serial_numbers]
|
return [d.get('name') for d in serial_numbers]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user