Party model patch
- Create receivable / payable account, set them in company
- Set party in JV and GL Entry
- Delete all exisintg individual party account
diff --git a/erpnext/patches/v4_2/party_model.py b/erpnext/patches/v4_2/party_model.py
index 91a1a26..b1ca87c 100644
--- a/erpnext/patches/v4_2/party_model.py
+++ b/erpnext/patches/v4_2/party_model.py
@@ -5,6 +5,85 @@
import frappe
def execute():
- frappe.reload_doc("accounts", "doctype", "account")
+ try:
+ frappe.reload_doc("accounts", "doctype", "account")
+ receivable_payable_accounts = create_receivable_payable_account()
+ set_party_in_jv_and_gl_entry(receivable_payable_accounts)
+ delete_individual_party_account(receivable_payable_accounts)
+ except:
+ print frappe.get_traceback()
+ pass
+
+
+def link_warehouse_account():
frappe.db.sql("""update tabAccount set warehouse=master_name
where ifnull(account_type, '') = 'Warehouse' and ifnull(master_name, '') != ''""")
+
+def create_receivable_payable_account():
+ receivable_payable_accounts = frappe._dict()
+
+ def _create_account(args):
+ account = frappe.new_doc("Account")
+ account.group_or_ledger = "Ledger"
+ account.update(args)
+ account.insert()
+
+ frappe.db.set_value("Company", args["company"],
+ ("receivables_group" if args["account_type"]=="Receivable" else "payables_group"), account.name)
+
+ receivable_payable_accounts.setdefault(args["company"], {}).setdefault(args["account_type"], account.name)
+
+ for company in frappe.db.sql_list("select name from tabCompany"):
+ _create_account({
+ "account_name": "Debtors",
+ "account_type": "Receivable",
+ "company": company,
+ "parent_account": get_parent_account(company, "Customer")
+ })
+
+ _create_account({
+ "account_name": "Creditors",
+ "account_type": "Payable",
+ "company": company,
+ "parent_account": get_parent_account(company, "Supplier")
+ })
+
+ return receivable_payable_accounts
+
+def get_parent_account(company, master_type):
+ parent_account = frappe.db.get_value("Company", company,
+ "receivables_group" if master_type=="Customer" else "payables_group")
+ if not parent_account:
+ parent_account = frappe.db.get_value("Account", {"company": company,
+ "account_name": "Accounts Receivable" if master_type=="Customer" else "Accounts Payable"})
+
+ if not parent_account:
+ parent_account = frappe.db.sql_list("""select parent_account from tabAccount
+ where company=%s and ifnull(master_type, '')=%s and ifnull(master_name, '')!='' limit 1""",
+ (company, master_type))
+ parent_account = parent_account[0][0] if parent_account else None
+
+ return parent_account
+
+def set_party_in_jv_and_gl_entry(receivable_payable_accounts):
+ accounts = frappe.db.sql("""select name, master_type, master_name, company from `tabAccount`
+ where ifnull(master_type, '') in ('Customer', 'Supplier') and ifnull(master_name, '') != ''""", as_dict=1)
+
+ account_map = frappe._dict()
+ for d in accounts:
+ account_map.setdefault(d.name, d)
+
+ for dt in ["Journal Voucher Detail", "GL Entry"]:
+ records = frappe.db.sql("""select name, account from `tab%s` where account in (%s)""" %
+ (dt, ", ".join(['%s']*len(account_map))), tuple(account_map.keys()))
+ for d in records:
+ account_details = account_map.get(d.account, {})
+ account_type = "Receivable" if account_details.get("master_type")=="Customer" else "Payable"
+ new_account = receivable_payable_accounts[account_details.get("company")][account_type]
+
+ frappe.db.sql("update `tab{0}` set account=%s, party_type=%s, party=%s where name=%s".format(dt),
+ (new_account, account_details.get("master_type"), account_details.get("master_name"), d.name))
+
+def delete_individual_party_account():
+ frappe.db.sql("""delete from `tabAccount` where ifnull(master_type, '') in ('Customer', 'Supplier')
+ and ifnull(master_name, '') != ''""")