From 8a28ccfa2fbcb362be71897444d4c029c44b1485 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 14 Oct 2014 11:41:44 +0530 Subject: [PATCH] Repost gl entries where mismatch with stock balance --- erpnext/patches.txt | 2 + .../fix_gl_entries_for_stock_transactions.py | 51 ++++++++++++++----- .../report/stock_balance/stock_balance.py | 8 +-- erpnext/utilities/repost_stock.py | 15 ++++-- 4 files changed, 56 insertions(+), 20 deletions(-) diff --git a/erpnext/patches.txt b/erpnext/patches.txt index bd2d436453..0dbe444472 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -83,3 +83,5 @@ erpnext.patches.v4_2.update_sales_order_invoice_field_name erpnext.patches.v4_2.cost_of_production_cycle erpnext.patches.v4_2.seprate_manufacture_and_repack execute:frappe.delete_doc("Report", "Warehouse-Wise Stock Balance") +execute:frappe.delete_doc("DocType", "Purchase Request") +execute:frappe.delete_doc("DocType", "Purchase Request Item") diff --git a/erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py b/erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py index e065d2d42f..3c554ae0f0 100644 --- a/erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py +++ b/erpnext/patches/v4_2/fix_gl_entries_for_stock_transactions.py @@ -3,24 +3,49 @@ from __future__ import unicode_literals import frappe +from frappe.utils import flt def execute(): - warehouses_with_account = frappe.db.sql_list("""select master_name from tabAccount - where ifnull(account_type, '') = 'Warehouse'""") + from erpnext.utilities.repost_stock import repost + repost() - stock_vouchers_without_gle = frappe.db.sql("""select distinct sle.voucher_type, sle.voucher_no + warehouse_account = frappe.db.sql("""select name, master_name from tabAccount + where ifnull(account_type, '') = 'Warehouse'""") + warehouses = [d[1] for d in warehouse_account] + accounts = [d[0] for d in warehouse_account] + + stock_vouchers = frappe.db.sql("""select distinct sle.voucher_type, sle.voucher_no from `tabStock Ledger Entry` sle where sle.warehouse in (%s) - and not exists(select name from `tabGL Entry` - where voucher_type=sle.voucher_type and voucher_no=sle.voucher_no) order by sle.posting_date""" % - ', '.join(['%s']*len(warehouses_with_account)), tuple(warehouses_with_account)) + ', '.join(['%s']*len(warehouses)), tuple(warehouses)) - for voucher_type, voucher_no in stock_vouchers_without_gle: - print voucher_type, voucher_no - frappe.db.sql("""delete from `tabGL Entry` - where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no)) + rejected = [] + for voucher_type, voucher_no in stock_vouchers: + stock_bal = frappe.db.sql("""select sum(stock_value_difference) from `tabStock Ledger Entry` + where voucher_type=%s and voucher_no =%s and warehouse in (%s)""" % + ('%s', '%s', ', '.join(['%s']*len(warehouses))), tuple([voucher_type, voucher_no] + warehouses)) - voucher = frappe.get_doc(voucher_type, voucher_no) - voucher.make_gl_entries() - frappe.db.commit() + account_bal = frappe.db.sql("""select ifnull(sum(ifnull(debit, 0) - ifnull(credit, 0)), 0) + from `tabGL Entry` + where voucher_type=%s and voucher_no =%s and account in (%s) + group by voucher_type, voucher_no""" % + ('%s', '%s', ', '.join(['%s']*len(accounts))), tuple([voucher_type, voucher_no] + accounts)) + + if stock_bal and account_bal and abs(flt(stock_bal[0][0]) - flt(account_bal[0][0])) > 0.1: + try: + print voucher_type, voucher_no, stock_bal[0][0], account_bal[0][0] + + frappe.db.sql("""delete from `tabGL Entry` + where voucher_type=%s and voucher_no=%s""", (voucher_type, voucher_no)) + + voucher = frappe.get_doc(voucher_type, voucher_no) + voucher.make_gl_entries(repost_future_gle=False, allow_negative_stock=True) + frappe.db.commit() + except Exception, e: + print frappe.get_traceback() + rejected.append([voucher_type, voucher_no]) + frappe.db.rollback() + + print "Failed to repost: " + print rejected diff --git a/erpnext/stock/report/stock_balance/stock_balance.py b/erpnext/stock/report/stock_balance/stock_balance.py index 95de739e0f..daef2ebd31 100644 --- a/erpnext/stock/report/stock_balance/stock_balance.py +++ b/erpnext/stock/report/stock_balance/stock_balance.py @@ -58,8 +58,8 @@ def get_conditions(filters): #get all details def get_stock_ledger_entries(filters): conditions = get_conditions(filters) - return frappe.db.sql("""select item_code, warehouse, posting_date, - actual_qty, valuation_rate, stock_uom, company, voucher_type, qty_after_transaction + return frappe.db.sql("""select item_code, warehouse, posting_date, actual_qty, valuation_rate, + stock_uom, company, voucher_type, qty_after_transaction, stock_value_difference from `tabStock Ledger Entry` where docstatus < 2 %s order by posting_date, posting_time, name""" % conditions, as_dict=1) @@ -82,10 +82,10 @@ def get_item_warehouse_map(filters): if d.voucher_type == "Stock Reconciliation": qty_diff = flt(d.qty_after_transaction) - qty_dict.bal_qty - value_diff = flt(d.stock_value) - qty_dict.bal_val else: qty_diff = flt(d.actual_qty) - value_diff = flt(d.actual_qty) * flt(d.valuation_rate) + + value_diff = flt(d.stock_value_difference) if d.posting_date < filters["from_date"]: qty_dict.opening_qty += qty_diff diff --git a/erpnext/utilities/repost_stock.py b/erpnext/utilities/repost_stock.py index 7d9423db14..89494ad2ca 100644 --- a/erpnext/utilities/repost_stock.py +++ b/erpnext/utilities/repost_stock.py @@ -22,7 +22,11 @@ def repost(allow_negative_stock=False): (select item_code, warehouse from tabBin union select item_code, warehouse from `tabStock Ledger Entry`) a"""): - repost_stock(d[0], d[1]) + try: + repost_stock(d[0], d[1]) + frappe.db.commit() + except: + frappe.db.rollback() if allow_negative_stock: frappe.db.set_default("allow_negative_stock", @@ -210,9 +214,14 @@ def reset_serial_no_status_and_warehouse(serial_nos=None): frappe.db.sql("""update `tabSerial No` set warehouse='' where status in ('Delivered', 'Purchase Returned')""") def repost_all_stock_vouchers(): + warehouses_with_account = frappe.db.sql_list("""select master_name from tabAccount + where ifnull(account_type, '') = 'Warehouse'""") + vouchers = frappe.db.sql("""select distinct voucher_type, voucher_no - from `tabStock Ledger Entry` - order by posting_date, posting_time, name""") + from `tabStock Ledger Entry` sle + where voucher_type != "Serial No" and sle.warehouse in (%s) + order by posting_date, posting_time, name""" % + ', '.join(['%s']*len(warehouses_with_account)), tuple(warehouses_with_account)) rejected = [] i = 0