From 3fbbb71afcd67eee67c05bbcb9d3061600ae55a9 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Fri, 17 Jul 2015 12:10:12 +0530 Subject: [PATCH 1/5] Added ability to freeze Customer/Supplier --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 6 ++++++ erpnext/buying/doctype/supplier/supplier.json | 9 ++++++++- erpnext/controllers/accounts_controller.py | 17 +++++++++++++++++ erpnext/selling/doctype/customer/customer.json | 9 ++++++++- 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index edee1226eb..de5b312287 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -17,6 +17,7 @@ class GLEntry(Document): self.validate_posting_date() self.check_pl_account() self.validate_cost_center() + self.validate_party() def on_update_with_args(self, adv_adj, update_outstanding = 'Yes'): self.validate_account_details(adv_adj) @@ -88,6 +89,11 @@ class GLEntry(Document): if self.cost_center and _get_cost_center_company() != self.company: frappe.throw(_("Cost Center {0} does not belong to Company {1}").format(self.cost_center, self.company)) + + def validate_party(self): + if self.meta.get_field("party_type"): + if frappe.db.get_value(self.party_type, self.party, "is_frozen"): + frappe.throw("Accounts for {0} {1} is frozen".format(self.party_type, self.party)) def validate_balance_type(account, adv_adj=False): if not adv_adj and account: diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index a1a38d5ccd..0ea49a0819 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -54,6 +54,13 @@ "permlevel": 0, "reqd": 1 }, + { + "fieldname": "is_frozen", + "fieldtype": "Check", + "label": "Is Frozen ?", + "permlevel": 0, + "precision": "" + }, { "depends_on": "eval:!doc.__islocal", "fieldname": "address_contacts", @@ -172,7 +179,7 @@ ], "icon": "icon-user", "idx": 1, - "modified": "2015-07-13 05:28:29.121285", + "modified": "2015-07-17 02:01:36.727437", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 7610042b5f..c893a0a09d 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -16,6 +16,7 @@ class AccountsController(TransactionBase): if self.get("_action") and self._action != "update_after_submit": self.set_missing_values(for_validate=True) self.validate_date_with_fiscal_year() + if self.meta.get_field("currency"): self.calculate_taxes_and_totals() if not self.meta.get_field("is_return") or not self.is_return: @@ -32,6 +33,8 @@ class AccountsController(TransactionBase): if self.meta.get_field("taxes_and_charges"): self.validate_enabled_taxes_and_charges() + + self.validate_party() def on_submit(self): if self.meta.get_field("is_recurring"): @@ -340,6 +343,20 @@ class AccountsController(TransactionBase): return self._abbr + def validate_party(self): + party = None + if self.meta.get_field("customer"): + party_type = 'customer' + party = self.customer + + elif self.meta.get_field("suppier"): + party_type = 'supplier' + party = self.supplier + + if party: + if frappe.db.get_value(party_type, party, "is_frozen"): + frappe.throw("Accounts for {0} {1} is frozen".format(party_type, party)) + @frappe.whitelist() def get_tax_rate(account_head): return frappe.db.get_value("Account", account_head, "tax_rate") diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index cced319cf5..cebfc29ced 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -101,6 +101,13 @@ "print_hide": 1, "reqd": 1 }, + { + "fieldname": "is_frozen", + "fieldtype": "Check", + "label": "Is Frozen ?", + "permlevel": 0, + "precision": "" + }, { "depends_on": "eval:!doc.__islocal", "fieldname": "address_contacts", @@ -278,7 +285,7 @@ ], "icon": "icon-user", "idx": 1, - "modified": "2015-07-13 05:28:25.753684", + "modified": "2015-07-16 09:07:11.565841", "modified_by": "Administrator", "module": "Selling", "name": "Customer", From 3698b84d7c1112c7b41392b1843a811c3fc95733 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Fri, 17 Jul 2015 19:10:11 +0530 Subject: [PATCH 2/5] Typo fixes in Supplier and Customer Document --- erpnext/buying/doctype/supplier/supplier.json | 4 ++-- erpnext/selling/doctype/customer/customer.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index 0ea49a0819..c3128a5187 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -57,7 +57,7 @@ { "fieldname": "is_frozen", "fieldtype": "Check", - "label": "Is Frozen ?", + "label": "Is Frozen", "permlevel": 0, "precision": "" }, @@ -179,7 +179,7 @@ ], "icon": "icon-user", "idx": 1, - "modified": "2015-07-17 02:01:36.727437", + "modified": "2015-07-17 09:39:05.318826", "modified_by": "Administrator", "module": "Buying", "name": "Supplier", diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index cebfc29ced..a3bcc8acb2 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -104,7 +104,7 @@ { "fieldname": "is_frozen", "fieldtype": "Check", - "label": "Is Frozen ?", + "label": "Is Frozen", "permlevel": 0, "precision": "" }, @@ -285,7 +285,7 @@ ], "icon": "icon-user", "idx": 1, - "modified": "2015-07-16 09:07:11.565841", + "modified": "2015-07-17 09:38:50.086978", "modified_by": "Administrator", "module": "Selling", "name": "Customer", From 79bf2337341dd8aae21fe8e7e07ae30b55616ee1 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Mon, 20 Jul 2015 13:03:48 +0530 Subject: [PATCH 3/5] Test Cases added to check if customer is frozen --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 6 ++++-- erpnext/controllers/accounts_controller.py | 17 +++++++++-------- .../selling/doctype/customer/test_customer.py | 19 +++++++++++++++++-- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index de5b312287..d3246d7554 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -9,6 +9,8 @@ from frappe import _ from frappe.model.document import Document +class CustomerFrozen(frappe.ValidationError): pass + class GLEntry(Document): def validate(self): self.flags.ignore_submit_comment = True @@ -91,9 +93,9 @@ class GLEntry(Document): frappe.throw(_("Cost Center {0} does not belong to Company {1}").format(self.cost_center, self.company)) def validate_party(self): - if self.meta.get_field("party_type"): + if self.party_type and self.party: if frappe.db.get_value(self.party_type, self.party, "is_frozen"): - frappe.throw("Accounts for {0} {1} is frozen".format(self.party_type, self.party)) + frappe.throw("{0} {1} is frozen".format(self.party_type, self.party), CustomerFrozen) def validate_balance_type(account, adv_adj=False): if not adv_adj and account: diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index c893a0a09d..cbd8a6fb82 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -11,6 +11,8 @@ from erpnext.utilities.transaction_base import TransactionBase from erpnext.controllers.recurring_document import convert_to_recurring, validate_recurring_document from erpnext.controllers.sales_and_purchase_return import validate_return +class CustomerFrozen(frappe.ValidationError): pass + class AccountsController(TransactionBase): def validate(self): if self.get("_action") and self._action != "update_after_submit": @@ -344,18 +346,17 @@ class AccountsController(TransactionBase): return self._abbr def validate_party(self): - party = None + party_type = None if self.meta.get_field("customer"): - party_type = 'customer' - party = self.customer + party_type = 'Customer' - elif self.meta.get_field("suppier"): - party_type = 'supplier' - party = self.supplier + elif self.meta.get_field("supplier"): + party_type = 'Supplier' - if party: + if party_type: + party = self.get(party_type.lower()) if frappe.db.get_value(party_type, party, "is_frozen"): - frappe.throw("Accounts for {0} {1} is frozen".format(party_type, party)) + frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) @frappe.whitelist() def get_tax_rate(account_head): diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index 1db6c6a24a..2f9c4e1270 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -7,6 +7,7 @@ import frappe import unittest from frappe.test_runner import make_test_records +from erpnext.controllers.accounts_controller import CustomerFrozen test_ignore = ["Price List"] @@ -65,5 +66,19 @@ class TestCustomer(unittest.TestCase): {"comment_doctype": "Customer", "comment_docname": "_Test Customer 1 Renamed"}), comment.name) frappe.rename_doc("Customer", "_Test Customer 1 Renamed", "_Test Customer 1") - - + + def test_freezed_customer(self): + cust = frappe.get_doc("Customer", "_Test Customer") + cust.is_frozen = 1 + cust.save() + + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + + so = make_sales_order(do_not_save= True) + so.customer = "_Test Customer" + self.assertRaises(CustomerFrozen, so.save) + + cust.is_frozen = 0 + cust.save() + + so.save() \ No newline at end of file From cc7cb2a70add9f9548493b1a8f1d599358e3e7d4 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Fri, 24 Jul 2015 13:10:50 +0530 Subject: [PATCH 4/5] Allowed frozen_accounts_modifier to create records against frozen customer/supplier --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 3 ++- erpnext/controllers/accounts_controller.py | 4 ++++ erpnext/selling/doctype/customer/test_customer.py | 8 ++------ 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index d3246d7554..83955ecdeb 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -93,7 +93,8 @@ class GLEntry(Document): frappe.throw(_("Cost Center {0} does not belong to Company {1}").format(self.cost_center, self.company)) def validate_party(self): - if self.party_type and self.party: + frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier') + if self.party_type and self.party and not frozen_accounts_modifier in frappe.get_roles(): if frappe.db.get_value(self.party_type, self.party, "is_frozen"): frappe.throw("{0} {1} is frozen".format(self.party_type, self.party), CustomerFrozen) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index cbd8a6fb82..55e9e3d000 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -346,6 +346,10 @@ class AccountsController(TransactionBase): return self._abbr def validate_party(self): + frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier') + if frozen_accounts_modifier in frappe.get_roles(): + return + party_type = None if self.meta.get_field("customer"): party_type = 'Customer' diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index 2f9c4e1270..dca4bb76fb 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -68,17 +68,13 @@ class TestCustomer(unittest.TestCase): frappe.rename_doc("Customer", "_Test Customer 1 Renamed", "_Test Customer 1") def test_freezed_customer(self): - cust = frappe.get_doc("Customer", "_Test Customer") - cust.is_frozen = 1 - cust.save() + frappe.db.set_value("Customer", "_Test Customer", "is_frozen", 1) from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order so = make_sales_order(do_not_save= True) - so.customer = "_Test Customer" self.assertRaises(CustomerFrozen, so.save) - cust.is_frozen = 0 - cust.save() + frappe.db.set_value("Customer", "_Test Customer", "is_frozen", 0) so.save() \ No newline at end of file From ff3b220c79907aa346fe2149693168cc5926439f Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Tue, 28 Jul 2015 12:23:14 +0530 Subject: [PATCH 5/5] Fixed gl_entry Validation --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 83955ecdeb..43c421352c 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import flt, fmt_money, getdate, formatdate, cstr, cint +from frappe.utils import flt, fmt_money, getdate, formatdate, cstr from frappe import _ from frappe.model.document import Document @@ -93,10 +93,11 @@ class GLEntry(Document): frappe.throw(_("Cost Center {0} does not belong to Company {1}").format(self.cost_center, self.company)) def validate_party(self): - frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier') - if self.party_type and self.party and not frozen_accounts_modifier in frappe.get_roles(): - if frappe.db.get_value(self.party_type, self.party, "is_frozen"): - frappe.throw("{0} {1} is frozen".format(self.party_type, self.party), CustomerFrozen) + if self.party_type and self.party: + frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier') + if not frozen_accounts_modifier in frappe.get_roles(): + if frappe.db.get_value(self.party_type, self.party, "is_frozen"): + frappe.throw("{0} {1} is frozen".format(self.party_type, self.party), CustomerFrozen) def validate_balance_type(account, adv_adj=False): if not adv_adj and account: