From 9653f60e89f48724f489c9edcbb96af30352e39f Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 20 Aug 2013 15:37:33 +0530 Subject: [PATCH] [fix] [minor] insert cancelled sl entry for serialized inventory and at the end delete --- .../doctype/sales_invoice/sales_invoice.py | 2 +- controllers/stock_controller.py | 24 +------------ stock/doctype/delivery_note/delivery_note.py | 12 +++---- .../purchase_receipt/purchase_receipt.py | 36 +++++++++---------- stock/doctype/stock_entry/stock_entry.py | 2 +- .../stock_ledger_entry/stock_ledger_entry.txt | 11 +++++- .../stock_reconciliation.py | 21 +++++++++++ stock/stock_ledger.py | 22 ++++++++++++ 8 files changed, 76 insertions(+), 54 deletions(-) diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py index 6b6472a5d82..b97ca3aba7f 100644 --- a/accounts/doctype/sales_invoice/sales_invoice.py +++ b/accounts/doctype/sales_invoice/sales_invoice.py @@ -111,7 +111,7 @@ class DocType(SellingController): def on_cancel(self): if cint(self.doc.update_stock) == 1: - self.delete_and_repost_sle() + self.update_stock_ledger() self.update_serial_nos(cancel = True) sales_com_obj = get_obj(dt = 'Sales Common') diff --git a/controllers/stock_controller.py b/controllers/stock_controller.py index c54fbb44cde..0ed2e2e0b2c 100644 --- a/controllers/stock_controller.py +++ b/controllers/stock_controller.py @@ -75,6 +75,7 @@ class StockController(AccountsController): "batch_no": cstr(d.batch_no).strip(), "serial_no": d.serial_no, "project": d.project_name, + "is_cancelled": self.doc.docstatus==2 and "Yes" or "No" } sl_dict.update(args) @@ -84,29 +85,6 @@ class StockController(AccountsController): from stock.stock_ledger import make_sl_entries make_sl_entries(sl_entries, is_amended) - def delete_and_repost_sle(self): - """ Delete Stock Ledger Entries related to this voucher - and repost future Stock Ledger Entries""" - - from stock.stock_ledger import update_entries_after - - existing_entries = webnotes.conn.sql("""select distinct item_code, warehouse - from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""", - (self.doc.doctype, self.doc.name), as_dict=1) - - # delete entries - webnotes.conn.sql("""delete from `tabStock Ledger Entry` - where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name)) - - # repost future entries for selected item_code, warehouse - for entries in existing_entries: - update_entries_after({ - "item_code": entries.item_code, - "warehouse": entries.warehouse, - "posting_date": self.doc.posting_date, - "posting_time": self.doc.posting_time - }) - def get_stock_ledger_entries(self, item_list=None, warehouse_list=None): out = {} diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py index 227d773ff2f..9e32f2a3d55 100644 --- a/stock/doctype/delivery_note/delivery_note.py +++ b/stock/doctype/delivery_note/delivery_note.py @@ -292,15 +292,11 @@ class DocType(SellingController): and d.warehouse: self.update_reserved_qty(d) - if self.doc.docstatus == 1: - sl_entries.append(self.get_sl_entries(d, { - "actual_qty": -1*flt(d['qty']), - })) + sl_entries.append(self.get_sl_entries(d, { + "actual_qty": -1*flt(d['qty']), + })) - if self.doc.docstatus == 1: - self.make_sl_entries(sl_entries) - else: - self.delete_and_repost_sle() + self.make_sl_entries(sl_entries) def update_reserved_qty(self, d): if d['reserved_qty'] < 0 : diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py index e8d468f84e5..3ce0a48b6d7 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/stock/doctype/purchase_receipt/purchase_receipt.py @@ -153,27 +153,23 @@ class DocType(BuyingController): pr_qty = flt(d.qty) * flt(d.conversion_factor) self.update_ordered_qty(pr_qty, d) - if self.doc.docstatus == 1: - if pr_qty: - sl_entries.append(self.get_sl_entries(d, { - "actual_qty": flt(pr_qty), - "serial_no": cstr(d.serial_no).strip(), - "incoming_rate": d.valuation_rate - })) - - if flt(d.rejected_qty) > 0: - sl_entries.append(self.get_sl_entries(d, { - "warehouse": self.doc.rejected_warehouse, - "actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor), - "serial_no": cstr(d.rejected_serial_no).strip(), - "incoming_rate": d.valuation_rate - })) + if pr_qty: + sl_entries.append(self.get_sl_entries(d, { + "actual_qty": flt(pr_qty), + "serial_no": cstr(d.serial_no).strip(), + "incoming_rate": d.valuation_rate + })) + + if flt(d.rejected_qty) > 0: + sl_entries.append(self.get_sl_entries(d, { + "warehouse": self.doc.rejected_warehouse, + "actual_qty": flt(d.rejected_qty) * flt(d.conversion_factor), + "serial_no": cstr(d.rejected_serial_no).strip(), + "incoming_rate": d.valuation_rate + })) - if self.doc.docstatus == 1: - self.bk_flush_supp_wh(sl_entries) - self.make_sl_entries(sl_entries) - else: - self.delete_and_repost_sle() + self.bk_flush_supp_wh(sl_entries) + self.make_sl_entries(sl_entries) def update_ordered_qty(self, pr_qty, d): pc_obj = get_obj('Purchase Common') diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py index c3b9a15d41d..3371a5ad832 100644 --- a/stock/doctype/stock_entry/stock_entry.py +++ b/stock/doctype/stock_entry/stock_entry.py @@ -56,7 +56,7 @@ class DocType(StockController): self.make_gl_entries() def on_cancel(self): - self.delete_and_repost_sle() + self.update_stock_ledger() self.update_serial_no(0) self.update_production_order(0) self.make_cancel_gl_entries() diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt index cee1d0e7966..047f7784622 100644 --- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt +++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-29 19:25:42", "docstatus": 0, - "modified": "2013-08-20 11:56:25", + "modified": "2013-08-20 15:02:48", "modified_by": "Administrator", "owner": "Administrator" }, @@ -272,6 +272,15 @@ "search_index": 0, "width": "150px" }, + { + "doctype": "DocField", + "fieldname": "is_cancelled", + "fieldtype": "Select", + "hidden": 1, + "label": "Is Cancelled", + "options": "\nNo\nYes", + "report_hide": 1 + }, { "amend": 0, "cancel": 0, diff --git a/stock/doctype/stock_reconciliation/stock_reconciliation.py b/stock/doctype/stock_reconciliation/stock_reconciliation.py index 6bbfe8b679c..c5fb5524dad 100644 --- a/stock/doctype/stock_reconciliation/stock_reconciliation.py +++ b/stock/doctype/stock_reconciliation/stock_reconciliation.py @@ -252,6 +252,27 @@ class DocType(StockController): # append to entries self.entries.append(args) + + def delete_and_repost_sle(self): + """ Delete Stock Ledger Entries related to this voucher + and repost future Stock Ledger Entries""" + + existing_entries = webnotes.conn.sql("""select distinct item_code, warehouse + from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""", + (self.doc.doctype, self.doc.name), as_dict=1) + + # delete entries + webnotes.conn.sql("""delete from `tabStock Ledger Entry` + where voucher_type=%s and voucher_no=%s""", (self.doc.doctype, self.doc.name)) + + # repost future entries for selected item_code, warehouse + for entries in existing_entries: + update_entries_after({ + "item_code": entries.item_code, + "warehouse": entries.warehouse, + "posting_date": self.doc.posting_date, + "posting_time": self.doc.posting_time + }) def set_stock_value_difference(self): """stock_value_difference is the increment in the stock value""" diff --git a/stock/stock_ledger.py b/stock/stock_ledger.py index 3bb3a00faae..740120cf98c 100644 --- a/stock/stock_ledger.py +++ b/stock/stock_ledger.py @@ -12,7 +12,16 @@ class NegativeStockError(webnotes.ValidationError): pass def make_sl_entries(sl_entries, is_amended=None): from stock.utils import update_bin + + cancel = True if sl_entries[0].get("is_cancelled") == "Yes" else False + if cancel: + set_as_cancel(sl_entries[0].get('voucher_no'), sl_entries[0].get('voucher_type')) + for sle in sl_entries: + sle_id = None + if sle.get('is_cancelled') == 'Yes': + sle['actual_qty'] = -flt(sle['actual_qty']) + if sle.get("actual_qty"): sle_id = make_entry(sle) @@ -23,6 +32,15 @@ def make_sl_entries(sl_entries, is_amended=None): }) update_bin(args) + if cancel: + delete_cancelled_entry(sl_entries[0].get('voucher_no'), sl_entries[0].get('voucher_type')) + +def set_as_cancel(voucher_type, voucher_no): + webnotes.conn.sql("""update `tabStock Ledger Entry` set is_cancelled='Yes', + modified=%s, modified_by=%s + where voucher_no=%s and voucher_type=%s""", + (now(), webnotes.session.user, voucher_type, voucher_no)) + def make_entry(args): args.update({"doctype": "Stock Ledger Entry"}) sle = webnotes.bean([args]) @@ -30,6 +48,10 @@ def make_entry(args): sle.insert() # sle.submit() return sle.doc.name + +def delete_cancelled_entry(voucher_type, voucher_no): + webnotes.conn.sql("""delete from `tabStock Ledger Entry` + where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no)) _exceptions = [] def update_entries_after(args, verbose=1):