From d7d9d25d7157cf2408891284d5e22ef2c17ec01c Mon Sep 17 00:00:00 2001 From: Nabin Hait <nabinhait@gmail.com> Date: Thu, 6 Mar 2014 18:22:51 +0530 Subject: [PATCH] Country and chart fields added in company master --- erpnext/setup/doctype/company/company.js | 9 + erpnext/setup/doctype/company/company.py | 204 ++++++++++-------- erpnext/setup/doctype/company/company.txt | 24 ++- erpnext/setup/doctype/company/test_company.py | 19 ++ erpnext/setup/doctype/country/country.txt | 8 +- 5 files changed, 170 insertions(+), 94 deletions(-) diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index 555685891a..4d1e20d586 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -98,8 +98,17 @@ cur_frm.fields_dict.receivables_group.get_query = function(doc) { } } +cur_frm.get_field("chart_of_accounts").get_query = function(doc) { + return { + filters: { + "country": doc.country + } + } +} + cur_frm.fields_dict.payables_group.get_query = cur_frm.fields_dict.receivables_group.get_query; + cur_frm.fields_dict.default_expense_account.get_query = function(doc) { return{ filters:{ diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index 7f6d84606c..7ceff79dc4 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -57,6 +57,16 @@ class DocType: def create_default_warehouses(self): for whname in ("Stores", "Work In Progress", "Finished Goods"): if not frappe.db.exists("Warehouse", whname + " - " + self.doc.abbr): + if not frappe.db.exists("Account", "Stock Assets - " + self.doc.abbr): + frappe.bean({ + "doctype": "Account", + "account_name": "Stock Assets", + "company": self.doc.name, + "group_or_ledger": "Group", + "root_type": "Asset", + "is_pl_account": "No" + }).insert() + frappe.bean({ "doctype":"Warehouse", "warehouse_name": whname, @@ -101,6 +111,108 @@ class DocType: style_settings.save() def create_default_accounts(self): + if self.doc.chart_of_accounts: + self.import_chart_of_account() + else: + self.create_standard_accounts() + + def import_chart_of_account(self): + chart = frappe.bean("Chart of Accounts", self.doc.chart_of_accounts) + chart.make_controller().create_accounts(self.doc.name) + + def add_acc(self,lst): + account = frappe.bean({ + "doctype": "Account", + "freeze_account": "No", + "master_type": "", + }) + for d in self.fld_dict.keys(): + account.doc.fields[d] = (d == 'parent_account' and lst[self.fld_dict[d]]) and lst[self.fld_dict[d]] +' - '+ self.doc.abbr or lst[self.fld_dict[d]] + + account.insert() + + def set_default_accounts(self): + def _set_default_accounts(accounts): + for a in accounts: + account_name = accounts[a] + " - " + self.doc.abbr + if not self.doc.fields.get(a) and frappe.db.exists("Account", account_name): + frappe.db.set(self.doc, a, account_name) + + _set_default_accounts({ + "receivables_group": "Accounts Receivable", + "payables_group": "Accounts Payable", + "default_cash_account": "Cash" + }) + + if cint(frappe.db.get_value("Accounts Settings", None, "auto_accounting_for_stock")): + _set_default_accounts({ + "stock_received_but_not_billed": "Stock Received But Not Billed", + "stock_adjustment_account": "Stock Adjustment", + "expenses_included_in_valuation": "Expenses Included In Valuation" + }) + + def create_default_cost_center(self): + cc_list = [ + { + 'cost_center_name': self.doc.name, + 'company':self.doc.name, + 'group_or_ledger':'Group', + 'parent_cost_center':'' + }, + { + 'cost_center_name':'Main', + 'company':self.doc.name, + 'group_or_ledger':'Ledger', + 'parent_cost_center':self.doc.name + ' - ' + self.doc.abbr + }, + ] + for cc in cc_list: + cc.update({"doctype": "Cost Center"}) + cc_bean = frappe.bean(cc) + cc_bean.ignore_permissions = True + + if cc.get("cost_center_name") == self.doc.name: + cc_bean.ignore_mandatory = True + cc_bean.insert() + + frappe.db.set(self.doc, "cost_center", "Main - " + self.doc.abbr) + + def on_trash(self): + """ + Trash accounts and cost centers for this company if no gl entry exists + """ + rec = frappe.db.sql("SELECT name from `tabGL Entry` where company = %s", self.doc.name) + if not rec: + #delete tabAccount + frappe.db.sql("delete from `tabAccount` where company = %s order by lft desc, rgt desc", self.doc.name) + + #delete cost center child table - budget detail + frappe.db.sql("delete bd.* from `tabBudget Detail` bd, `tabCost Center` cc where bd.parent = cc.name and cc.company = %s", self.doc.name) + #delete cost center + frappe.db.sql("delete from `tabCost Center` WHERE company = %s order by lft desc, rgt desc", self.doc.name) + + if not frappe.db.get_value("Stock Ledger Entry", {"company": self.doc.name}): + frappe.db.sql("""delete from `tabWarehouse` where company=%s""", self.doc.name) + + frappe.defaults.clear_default("company", value=self.doc.name) + + frappe.db.sql("""update `tabSingles` set value="" + where doctype='Global Defaults' and field='default_company' + and value=%s""", self.doc.name) + + def before_rename(self, olddn, newdn, merge=False): + if merge: + frappe.throw(_("Sorry, companies cannot be merged")) + + def after_rename(self, olddn, newdn, merge=False): + frappe.db.set(self.doc, "company_name", newdn) + + frappe.db.sql("""update `tabDefaultValue` set defvalue=%s + where defkey='Company' and defvalue=%s""", (newdn, olddn)) + + frappe.defaults.clear_cache() + + def create_standard_accounts(self): self.fld_dict = {'account_name':0,'parent_account':1,'group_or_ledger':2,'is_pl_account':3,'account_type':4,'root_type':5,'company':6,'tax_rate':7} acc_list_common = [ ['Application of Funds (Assets)','','Group','No','','Asset',self.doc.name,''], @@ -225,98 +337,6 @@ class DocType: for d in acc_list_india: self.add_acc(d) - def add_acc(self,lst): - account = frappe.bean({ - "doctype": "Account", - "freeze_account": "No", - "master_type": "", - }) - for d in self.fld_dict.keys(): - account.doc.fields[d] = (d == 'parent_account' and lst[self.fld_dict[d]]) and lst[self.fld_dict[d]] +' - '+ self.doc.abbr or lst[self.fld_dict[d]] - - account.insert() - - def set_default_accounts(self): - def _set_default_accounts(accounts): - for a in accounts: - account_name = accounts[a] + " - " + self.doc.abbr - if not self.doc.fields.get(a) and frappe.db.exists("Account", account_name): - frappe.db.set(self.doc, a, account_name) - - _set_default_accounts({ - "receivables_group": "Accounts Receivable", - "payables_group": "Accounts Payable", - "default_cash_account": "Cash" - }) - - if cint(frappe.db.get_value("Accounts Settings", None, "auto_accounting_for_stock")): - _set_default_accounts({ - "stock_received_but_not_billed": "Stock Received But Not Billed", - "stock_adjustment_account": "Stock Adjustment", - "expenses_included_in_valuation": "Expenses Included In Valuation" - }) - - def create_default_cost_center(self): - cc_list = [ - { - 'cost_center_name': self.doc.name, - 'company':self.doc.name, - 'group_or_ledger':'Group', - 'parent_cost_center':'' - }, - { - 'cost_center_name':'Main', - 'company':self.doc.name, - 'group_or_ledger':'Ledger', - 'parent_cost_center':self.doc.name + ' - ' + self.doc.abbr - }, - ] - for cc in cc_list: - cc.update({"doctype": "Cost Center"}) - cc_bean = frappe.bean(cc) - cc_bean.ignore_permissions = True - - if cc.get("cost_center_name") == self.doc.name: - cc_bean.ignore_mandatory = True - cc_bean.insert() - - frappe.db.set(self.doc, "cost_center", "Main - " + self.doc.abbr) - - def on_trash(self): - """ - Trash accounts and cost centers for this company if no gl entry exists - """ - rec = frappe.db.sql("SELECT name from `tabGL Entry` where company = %s", self.doc.name) - if not rec: - #delete tabAccount - frappe.db.sql("delete from `tabAccount` where company = %s order by lft desc, rgt desc", self.doc.name) - - #delete cost center child table - budget detail - frappe.db.sql("delete bd.* from `tabBudget Detail` bd, `tabCost Center` cc where bd.parent = cc.name and cc.company = %s", self.doc.name) - #delete cost center - frappe.db.sql("delete from `tabCost Center` WHERE company = %s order by lft desc, rgt desc", self.doc.name) - - if not frappe.db.get_value("Stock Ledger Entry", {"company": self.doc.name}): - frappe.db.sql("""delete from `tabWarehouse` where company=%s""", self.doc.name) - - frappe.defaults.clear_default("company", value=self.doc.name) - - frappe.db.sql("""update `tabSingles` set value="" - where doctype='Global Defaults' and field='default_company' - and value=%s""", self.doc.name) - - def before_rename(self, olddn, newdn, merge=False): - if merge: - frappe.throw(_("Sorry, companies cannot be merged")) - - def after_rename(self, olddn, newdn, merge=False): - frappe.db.set(self.doc, "company_name", newdn) - - frappe.db.sql("""update `tabDefaultValue` set defvalue=%s - where defkey='Company' and defvalue=%s""", (newdn, olddn)) - - frappe.defaults.clear_cache() - @frappe.whitelist() def replace_abbr(company, old, new): frappe.db.set_value("Company", company, "abbr", new) diff --git a/erpnext/setup/doctype/company/company.txt b/erpnext/setup/doctype/company/company.txt index 4832ae03da..3aca525390 100644 --- a/erpnext/setup/doctype/company/company.txt +++ b/erpnext/setup/doctype/company/company.txt @@ -2,7 +2,7 @@ { "creation": "2013-04-10 08:35:39", "docstatus": 0, - "modified": "2014-01-30 16:32:41", + "modified": "2014-03-05 14:54:29", "modified_by": "Administrator", "owner": "Administrator" }, @@ -85,6 +85,28 @@ "options": "Distribution\nManufacturing\nRetail\nServices", "reqd": 0 }, + { + "doctype": "DocField", + "fieldname": "charts_section", + "fieldtype": "Section Break", + "label": "Chart of Accounts" + }, + { + "doctype": "DocField", + "fieldname": "country", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Country", + "options": "Country", + "reqd": 0 + }, + { + "doctype": "DocField", + "fieldname": "chart_of_accounts", + "fieldtype": "Link", + "label": "Chart of Accounts", + "options": "Chart of Accounts" + }, { "doctype": "DocField", "fieldname": "default_settings", diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py index bae6fc9e0d..e21ebfd869 100644 --- a/erpnext/setup/doctype/company/test_company.py +++ b/erpnext/setup/doctype/company/test_company.py @@ -3,6 +3,25 @@ test_ignore = ["Account", "Cost Center"] +import frappe +import unittest + +class TestCompany(unittest.TestCase): + def test_coa(self): + company_bean = frappe.bean({ + "doctype": "Company", + "company_name": "_Test Company 2", + "abbr": "_TC2", + "default_currency": "INR", + "country": "India", + "chart_of_accounts": "India - Chart of Accounts for Public Ltd" + }) + + company_bean.insert() + + self.assertTrue(frappe.db.get_value("Account", "Balance Sheet - _TC2")) + + test_records = [ [{ "doctype": "Company", diff --git a/erpnext/setup/doctype/country/country.txt b/erpnext/setup/doctype/country/country.txt index 991c8a9310..57d2025316 100644 --- a/erpnext/setup/doctype/country/country.txt +++ b/erpnext/setup/doctype/country/country.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-19 10:23:30", "docstatus": 0, - "modified": "2013-12-20 19:24:00", + "modified": "2014-03-05 14:36:16", "modified_by": "Administrator", "owner": "Administrator" }, @@ -62,6 +62,12 @@ "fieldtype": "Text", "label": "Time Zones" }, + { + "doctype": "DocField", + "fieldname": "code", + "fieldtype": "Data", + "label": "Code" + }, { "amend": 0, "cancel": 0,