From fe14f69e71f0c4a5b121be139905afd4c14de2b7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 20 Aug 2013 20:06:14 +0530 Subject: [PATCH] [fix] [patch] [minor] sle for deleted stock entry detail --- .../p06_fix_sle_against_stock_entry.py | 132 +++++++++++++++--- 1 file changed, 114 insertions(+), 18 deletions(-) diff --git a/patches/august_2013/p06_fix_sle_against_stock_entry.py b/patches/august_2013/p06_fix_sle_against_stock_entry.py index 4413eeaa09..dbc2c94ecf 100644 --- a/patches/august_2013/p06_fix_sle_against_stock_entry.py +++ b/patches/august_2013/p06_fix_sle_against_stock_entry.py @@ -1,23 +1,119 @@ import webnotes + +cancelled = [] +uncancelled = [] + def execute(): from stock.stock_ledger import update_entries_after - - stock_entries = webnotes.conn.sql("""select name from `tabStock Entry` - where docstatus < 2 and modified >= '2013-08-15' - and ifnull(production_order, '') != '' and ifnull(bom_no, '') != ''""") - + + stock_entries = webnotes.conn.sql("""select * from `tabStock Entry` + where docstatus >= 1 and date(modified) >= "2013-08-16" and date(modified) <= "2013-08-21" + and ifnull(production_order, '') != '' and ifnull(bom_no, '') != '' + order by modified desc, name desc""", as_dict=True) + for entry in stock_entries: - webnotes.conn.sql("""update `tabStock Ledger Entry` set is_cancelled = 'Yes' - where voucher_type = 'Stock Entry' and voucher_no = %s""", entry[0]) + if not webnotes.conn.sql("""select name from `tabStock Entry Detail` + where parent=%s""", entry.name): + res = webnotes.conn.sql("""select * from `tabStock Ledger Entry` + where voucher_type='Stock Entry' and voucher_no=%s + and is_cancelled='No'""", entry.name, as_dict=True) + if res: + print entry + make_stock_entry_detail(entry, res) + + if cancelled or uncancelled: + send_email() - item_warehouse = webnotes.conn.sql("""select distinct item_code, warehouse - from `tabStock Ledger Entry` - where voucher_type = 'Stock Entry' and voucher_no = %s""", entry[0], as_dict=1) - - for d in item_warehouse: - update_entries_after({ - "item_code": d.item_code, - "warehouse": d.warehouse, - "posting_date": "2013-08-15", - "posting_date": "01:00" - }) \ No newline at end of file +def make_stock_entry_detail(entry, res): + global cancelled, uncancelled + + fg_item = webnotes.conn.get_value("Production Order", entry.production_order, + "production_item") + voucher_detail_entries_map = {} + for sle in res: + voucher_detail_entries_map.setdefault(sle.voucher_detail_no, []).append(sle) + + for i, voucher_detail_no in enumerate(sorted(voucher_detail_entries_map.keys())): + sl_entries = voucher_detail_entries_map[voucher_detail_no] + # create stock entry details back from stock ledger entries + stock_entry_detail = webnotes.doc({ + "doctype": "Stock Entry Detail", + "parentfield": "mtn_details", + "parenttype": "Stock Entry", + "parent": entry.name, + "__islocal": 1, + "idx": i+1, + "docstatus": 1, + "owner": entry.owner, + "name": voucher_detail_no, + "transfer_qty": abs(sl_entries[0].actual_qty), + "qty": abs(sl_entries[0].actual_qty), + "stock_uom": sl_entries[0].stock_uom, + "uom": sl_entries[0].stock_uom, + "conversion_factor": 1, + "item_code": sl_entries[0].item_code, + "description": webnotes.conn.get_value("Item", sl_entries[0].item_code, + "description"), + "incoming_rate": sl_entries[0].incoming_rate, + "batch_no": sl_entries[0].batch_no, + "serial_no": sl_entries[0].serial_no + }) + + if sl_entries[0].item_code == fg_item: + stock_entry_detail.bom_no = entry.bom_no + + for sle in sl_entries: + if sle.actual_qty < 0: + stock_entry_detail.s_warehouse = sle.warehouse + else: + stock_entry_detail.t_warehouse = sle.warehouse + + stock_entry_detail.save() + + if entry.docstatus == 2: + webnotes.conn.set_value("Stock Entry", entry.name, "docstatus", 1) + + # call for cancelled ones + se = webnotes.bean("Stock Entry", entry.name) + controller = se.make_controller() + controller.update_production_order(1) + + res = webnotes.conn.sql("""select name from `tabStock Entry` + where amended_from=%s""", entry.name) + if res: + cancelled.append(res[0][0]) + if res[0][0] in uncancelled: + uncancelled.remove(res[0][0]) + + webnotes.bean("Stock Entry", res[0][0]).cancel() + + uncancelled.append(se.doc.name) + +def send_email(): + from webnotes.utils.email_lib import sendmail_to_system_managers + global cancelled, uncancelled + uncancelled = "we have undone the cancellation of the following Stock Entries through a patch:\n" + \ + "\n".join(uncancelled) if uncancelled else "" + cancelled = "and cancelled the following Stock Entries:\n" + "\n".join(cancelled) \ + if cancelled else "" + + subject = "[ERPNext] [Important] Cancellation undone for some Stock Entries" + content = """Dear user, + +An error got introduced into the code that cleared the item table in Stock Entry associated to a Production Order. + +Hence, +%s + +%s + +You will have to edit them again. + +Sorry for the inconvenience this has caused. + +Regards, +Team ERPNext.""" % (uncancelled, cancelled) + + print subject, content + + # sendmail_to_system_managers(subject, content) \ No newline at end of file