From f5fd2cd4a2ab3c5645f539b4502715288dc9432c Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 21 Sep 2020 01:20:00 +0530 Subject: [PATCH] fix: stock reconciliation, incorrect serial nos fetched in the current serial no field --- .../stock_reconciliation/stock_reconciliation.py | 13 +++++++++---- erpnext/stock/stock_ledger.py | 8 +++++++- erpnext/stock/utils.py | 6 +----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py index 170a62c8846..ca59e67a676 100644 --- a/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -165,9 +165,12 @@ class StockReconciliation(StockController): validate_is_stock_item(item_code, item.is_stock_item, verbose=0) # item should not be serialized - if item.has_serial_no and not row.serial_no and not item.serial_no_series: + if item.has_serial_no and not row.serial_no and not item.serial_no_series and flt(row.qty) > 0: raise frappe.ValidationError(_("Serial no(s) required for serialized item {0}").format(item_code)) + if flt(row.qty) == 0 and row.serial_no: + row.serial_no = '' + # item managed batch-wise not allowed if item.has_batch_no and not row.batch_no and not item.create_new_batch: raise frappe.ValidationError(_("Batch no is required for batched item {0}").format(item_code)) @@ -235,7 +238,7 @@ class StockReconciliation(StockController): sl_entries = self.merge_similar_item_serial_nos(sl_entries) def issue_existing_serial_and_batch(self, sl_entries): - from erpnext.stock.stock_ledger import get_previous_sle + from erpnext.stock.stock_ledger import get_stock_ledger_entries for row in self.items: serial_nos = get_serial_nos(row.serial_no) or [] @@ -261,12 +264,14 @@ class StockReconciliation(StockController): for serial_no in serial_nos: args = self.get_sle_for_items(row, [serial_no]) - previous_sle = get_previous_sle({ + previous_sle = get_stock_ledger_entries({ "item_code": row.item_code, "posting_date": self.posting_date, "posting_time": self.posting_time, "serial_no": serial_no - }) + }, "<", "desc", "limit 1") + + previous_sle = previous_sle and previous_sle[0] or {} if previous_sle and row.warehouse != previous_sle.get("warehouse"): # If serial no exists in different warehouse diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index ba885c09487..5c4bba730e3 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -460,7 +460,13 @@ def get_stock_ledger_entries(previous_sle, operator=None, conditions += " and " + previous_sle.get("warehouse_condition") if check_serial_no and previous_sle.get("serial_no"): - conditions += " and serial_no like {}".format(frappe.db.escape('%{0}%'.format(previous_sle.get("serial_no")))) + serial_no = previous_sle.get("serial_no") + conditions += """ and ( + serial_no = '{0}' + OR serial_no like '{0}\n%%' + OR serial_no like '%%\n{0}' + OR serial_no like '%%\n{0}\n%%' + ) and actual_qty > 0""".format(serial_no) if not previous_sle.get("posting_date"): previous_sle["posting_date"] = "1900-01-01" diff --git a/erpnext/stock/utils.py b/erpnext/stock/utils.py index 95ecb7fecd7..db39bae8a63 100644 --- a/erpnext/stock/utils.py +++ b/erpnext/stock/utils.py @@ -96,11 +96,7 @@ def get_stock_balance(item_code, warehouse, posting_date=None, posting_time=None if with_valuation_rate: if with_serial_no: - serial_nos = last_entry.get("serial_no") - - if (serial_nos and - len(get_serial_nos_data(serial_nos)) < last_entry.qty_after_transaction): - serial_nos = get_serial_nos_data_after_transactions(args) + serial_nos = get_serial_nos_data_after_transactions(args) return ((last_entry.qty_after_transaction, last_entry.valuation_rate, serial_nos) if last_entry else (0.0, 0.0, 0.0))