From 29b565fdf54cb7d59e52a9ae1ab70c143ceae827 Mon Sep 17 00:00:00 2001 From: shreyas Date: Mon, 25 Jan 2016 17:30:49 +0530 Subject: [PATCH 1/7] Added Disabled field to Supplier and Customer doctype Frozen field is moved to More Information section for Customer and Supplier. Any Supplier/Customer which is disabled will not be shown while creating PO/SO --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 10 +- erpnext/accounts/party.py | 12 +- erpnext/buying/doctype/supplier/supplier.json | 1281 +++++++++-------- .../buying/doctype/supplier/test_supplier.py | 22 +- erpnext/controllers/accounts_controller.py | 29 +- erpnext/controllers/queries.py | 12 +- erpnext/exceptions.py | 1 + .../selling/doctype/customer/customer.json | 34 +- .../selling/doctype/customer/test_customer.py | 28 +- 9 files changed, 759 insertions(+), 670 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 1f6ff354b6a..34c87d5c908 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -6,10 +6,10 @@ import frappe from frappe import _ from frappe.utils import flt, fmt_money, getdate, formatdate from frappe.model.document import Document -from erpnext.accounts.party import validate_party_gle_currency +from erpnext.accounts.party import validate_party_gle_currency, validate_party_frozen_disabled from erpnext.accounts.utils import get_account_currency from erpnext.setup.doctype.company.company import get_company_currency -from erpnext.exceptions import InvalidAccountCurrency, CustomerFrozen +from erpnext.exceptions import InvalidAccountCurrency exclude_from_linked_with = True @@ -96,11 +96,7 @@ 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 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) + validate_party_frozen_disabled(self.party, self.party_type) def validate_currency(self): company_currency = get_company_currency(self.company) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index e76137905ed..b7478ae9fd8 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -10,7 +10,7 @@ from frappe.defaults import get_user_permissions from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff from erpnext.utilities.doctype.address.address import get_address_display from erpnext.utilities.doctype.contact.contact import get_contact_details -from erpnext.exceptions import InvalidAccountCurrency +from erpnext.exceptions import CustomerFrozen, InvalidCurrency, CustomerDisabled class DuplicatePartyAccountError(frappe.ValidationError): pass @@ -308,3 +308,13 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup args.update({"use_for_shopping_cart": use_for_shopping_cart}) return get_tax_template(posting_date, args) + +def validate_party_frozen_disabled(party, party_type): + if party_type and 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(party_type, party, "is_frozen"): + frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) + + if frappe.db.get_value(party_type, party, "disabled"): + frappe.throw("{0} {1} is disabled".format(party_type, party), CustomerDisabled) diff --git a/erpnext/buying/doctype/supplier/supplier.json b/erpnext/buying/doctype/supplier/supplier.json index b7697da2269..659536782aa 100644 --- a/erpnext/buying/doctype/supplier/supplier.json +++ b/erpnext/buying/doctype/supplier/supplier.json @@ -1,690 +1,715 @@ { - "allow_copy": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "naming_series:", - "creation": "2013-01-10 16:34:11", - "custom": 0, - "description": "Supplier of Goods or Services.", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", + "allow_copy": 0, + "allow_import": 1, + "allow_rename": 1, + "autoname": "naming_series:", + "creation": "2013-01-10 16:34:11", + "custom": 0, + "description": "Supplier of Goods or Services.", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Setup", "fields": [ { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "basic_info", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "options": "icon-user", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "basic_info", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Section Break", + "options": "icon-user", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "naming_series", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Series", - "length": 0, - "no_copy": 1, - "oldfieldname": "naming_series", - "oldfieldtype": "Select", - "options": "SUPP-", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Series", + "length": 0, + "no_copy": 1, + "oldfieldname": "naming_series", + "oldfieldtype": "Select", + "options": "SUPP-", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "supplier_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Supplier Name", - "length": 0, - "no_copy": 1, - "oldfieldname": "supplier_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "supplier_name", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier Name", + "length": 0, + "no_copy": 1, + "oldfieldname": "supplier_name", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break0", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "supplier_type", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 1, - "label": "Supplier Type", - "length": 0, - "no_copy": 0, - "oldfieldname": "supplier_type", - "oldfieldtype": "Link", - "options": "Supplier Type", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "supplier_type", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Supplier Type", + "length": 0, + "no_copy": 0, + "oldfieldname": "supplier_type", + "oldfieldtype": "Link", + "options": "Supplier Type", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "is_frozen", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Is Frozen", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 1, + "collapsible": 0, + "default": "0", + "fieldname": "disabled", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Disabled", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "section_break_7", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "section_break_7", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "default_currency", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Billing Currency", - "length": 0, - "no_copy": 1, - "options": "Currency", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_currency", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Billing Currency", + "length": 0, + "no_copy": 1, + "options": "Currency", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "default_price_list", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "in_filter": 0, - "in_list_view": 0, - "label": "Price List", - "length": 0, - "no_copy": 0, - "options": "Price List", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "default_price_list", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 1, + "in_filter": 0, + "in_list_view": 0, + "label": "Price List", + "length": 0, + "no_copy": 0, + "options": "Price List", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "fieldname": "section_credit_limit", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Credit Limit", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "fieldname": "section_credit_limit", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Limit", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "credit_days_based_on", - "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Credit Days Based On", - "length": 0, - "no_copy": 0, - "options": "\nFixed Days\nLast Day of the Next Month", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "credit_days_based_on", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Days Based On", + "length": 0, + "no_copy": 0, + "options": "\nFixed Days\nLast Day of the Next Month", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:doc.credit_days_based_on == 'Fixed Days'", - "fieldname": "credit_days", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Credit Days", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:doc.credit_days_based_on == 'Fixed Days'", + "fieldname": "credit_days", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Credit Days", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "eval:!doc.__islocal", - "fieldname": "address_contacts", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Address and Contacts", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Column Break", - "options": "icon-map-marker", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "eval:!doc.__islocal", + "fieldname": "address_contacts", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Address and Contacts", + "length": 0, + "no_copy": 0, + "oldfieldtype": "Column Break", + "options": "icon-map-marker", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "address_html", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Address HTML", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "address_html", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Address HTML", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "column_break1", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "column_break1", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "contact_html", - "fieldtype": "HTML", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Contact HTML", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "contact_html", + "fieldtype": "HTML", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Contact HTML", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "collapsible_depends_on": "accounts", - "fieldname": "default_payable_accounts", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Default Payable Accounts", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "accounts", + "fieldname": "default_payable_accounts", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Default Payable Accounts", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "depends_on": "", - "description": "Mention if non-standard receivable account", - "fieldname": "accounts", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Accounts", - "length": 0, - "no_copy": 0, - "options": "Party Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "depends_on": "", + "description": "Mention if non-standard receivable account", + "fieldname": "accounts", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Accounts", + "length": 0, + "no_copy": 0, + "options": "Party Account", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 1, - "collapsible_depends_on": "supplier_details", - "fieldname": "column_break2", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Supplier Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "unique": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "collapsible_depends_on": "supplier_details", + "fieldname": "column_break2", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "More Information", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0, "width": "50%" - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "fieldname": "website", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Website", - "length": 0, - "no_copy": 0, - "oldfieldname": "website", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "website", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Website", + "length": 0, + "no_copy": 0, + "oldfieldname": "website", + "oldfieldtype": "Data", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 - }, + }, { - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "description": "Statutory info and other general information about your Supplier", - "fieldname": "supplier_details", - "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "in_filter": 0, - "in_list_view": 0, - "label": "Supplier Details", - "length": 0, - "no_copy": 0, - "oldfieldname": "supplier_details", - "oldfieldtype": "Code", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "description": "Statutory info and other general information about your Supplier", + "fieldname": "supplier_details", + "fieldtype": "Text", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier Details", + "length": 0, + "no_copy": 0, + "oldfieldname": "supplier_details", + "oldfieldtype": "Code", + "permlevel": 0, + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "is_frozen", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Is Frozen", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, "unique": 0 } - ], - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-user", - "idx": 1, - "in_create": 0, - "in_dialog": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2016-01-22 02:18:14.158258", - "modified_by": "Administrator", - "module": "Buying", - "name": "Supplier", - "owner": "Administrator", + ], + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-user", + "idx": 1, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2016-01-25 06:55:53.404069", + "modified_by": "Administrator", + "module": "Buying", + "name": "Supplier", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase Master Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase Master Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Stock User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Stock User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Stock Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Accounts User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "amend": 0, - "apply_user_permissions": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 } - ], - "read_only": 0, - "read_only_onload": 0, - "search_fields": "supplier_name, supplier_type", - "sort_order": "ASC", + ], + "read_only": 0, + "read_only_onload": 0, + "search_fields": "supplier_name, supplier_type", + "sort_order": "ASC", "title_field": "supplier_name" -} \ No newline at end of file +} diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index 7a4a0cdea84..cc551ac683a 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -2,9 +2,11 @@ # License: GNU General Public License v3. See license.txt from __future__ import unicode_literals -import frappe -import unittest + +import frappe, unittest from erpnext.accounts.party import get_due_date +from erpnext.exceptions import CustomerFrozen, CustomerDisabled +from frappe.test_runner import make_test_records test_records = frappe.get_test_records('Supplier') @@ -52,3 +54,19 @@ class TestSupplier(unittest.TestCase): # Non Leap year due_date = get_due_date("2017-01-22", "Supplier", "_Test Supplier", "_Test Company") self.assertEqual(due_date, "2017-02-28") + + + def test_supplier_disabled(self): + make_test_records("Item") + + frappe.db.set_value("Supplier", "_Test Supplier", "disabled", 1) + + from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order + + po = create_purchase_order(do_not_save=True) + + self.assertRaises(CustomerDisabled, po.save) + + frappe.db.set_value("Supplier", "_Test Supplier", "disabled", 0) + + po.save() diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 9aab8eb376d..12df9a79960 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -10,8 +10,8 @@ from erpnext.accounts.utils import get_fiscal_year, validate_fiscal_year, get_ac 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 -from erpnext.accounts.party import get_party_account_currency -from erpnext.exceptions import CustomerFrozen, InvalidCurrency +from erpnext.accounts.party import get_party_account_currency, validate_party_frozen_disabled +from erpnext.exceptions import CustomerFrozen, InvalidCurrency, CustomerDisabled force_item_fields = ("item_group", "barcode", "brand", "stock_uom") @@ -416,23 +416,22 @@ 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, party = self.get_party() - - if party_type: - if frappe.db.get_value(party_type, party, "is_frozen"): - frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) + validate_party_frozen_disabled(party, party_type) def get_party(self): party_type = None - if self.meta.get_field("customer"): - party_type = 'Customer' + if self.doctype in ("Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"): + party_type = 'Customer' + + elif self.doctype in ("Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"): + party_type = 'Supplier' + + elif self.meta.get_field("customer"): + party_type = "Customer" elif self.meta.get_field("supplier"): - party_type = 'Supplier' + party_type = "Supplier" party = self.get(party_type.lower()) if party_type else None @@ -451,7 +450,9 @@ class AccountsController(TransactionBase): frappe.throw(_("Accounting Entry for {0}: {1} can only be made in currency: {2}") .format(party_type, party, party_account_currency), InvalidCurrency) - # Note: not validating with gle account because we don't have the account at quotation / sales order level and we shouldn't stop someone from creating a sales invoice if sales order is already created + # Note: not validating with gle account because we don't have the account + # at quotation / sales order level and we shouldn't stop someone + # from creating a sales invoice if sales order is already created @frappe.whitelist() def get_tax_rate(account_head): diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index ca431ce724b..e3f3f89c8da 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -89,7 +89,7 @@ def customer_query(doctype, txt, searchfield, start, page_len, filters): return frappe.db.sql("""select {fields} from `tabCustomer` where docstatus < 2 and ({key} like %(txt)s - or customer_name like %(txt)s) + or customer_name like %(txt)s) and disabled=0 {mcond} order by if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999), @@ -118,7 +118,7 @@ def supplier_query(doctype, txt, searchfield, start, page_len, filters): return frappe.db.sql("""select {field} from `tabSupplier` where docstatus < 2 and ({key} like %(txt)s - or supplier_name like %(txt)s) + or supplier_name like %(txt)s) and disabled=0 {mcond} order by if(locate(%(_txt)s, name), locate(%(_txt)s, name), 99999), @@ -216,12 +216,8 @@ def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, return frappe.db.sql("""select `tabDelivery Note`.name, `tabDelivery Note`.customer_name from `tabDelivery Note` where `tabDelivery Note`.`%(key)s` like %(txt)s and - `tabDelivery Note`.docstatus = 1 and status not in ("Stopped", "Closed") %(fcond)s and - (ifnull((select sum(qty) from `tabDelivery Note Item` where - `tabDelivery Note Item`.parent=`tabDelivery Note`.name), 0) > - ifnull((select sum(qty) from `tabSales Invoice Item` where - `tabSales Invoice Item`.docstatus = 1 and - `tabSales Invoice Item`.delivery_note=`tabDelivery Note`.name), 0)) + `tabDelivery Note`.docstatus = 1 and status not in ("Stopped", "Closed") %(fcond)s + and `tabDelivery Note`.per_billed < 100 %(mcond)s order by `tabDelivery Note`.`%(key)s` asc limit %(start)s, %(page_len)s""" % { "key": searchfield, diff --git a/erpnext/exceptions.py b/erpnext/exceptions.py index c339edf2398..808523b0142 100644 --- a/erpnext/exceptions.py +++ b/erpnext/exceptions.py @@ -5,3 +5,4 @@ import frappe class CustomerFrozen(frappe.ValidationError): pass class InvalidAccountCurrency(frappe.ValidationError): pass class InvalidCurrency(frappe.ValidationError): pass +class CustomerDisabled(frappe.ValidationError):pass diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index 3ebfa7dc9e9..c85fdb4280a 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -241,13 +241,14 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, - "fieldname": "is_frozen", + "default": "0", + "fieldname": "disabled", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Is Frozen", + "label": "Disabled", "length": 0, "no_copy": 0, "permlevel": 0, @@ -591,7 +592,7 @@ "ignore_user_permissions": 0, "in_filter": 0, "in_list_view": 0, - "label": "Customer Details", + "label": "More Information", "length": 0, "no_copy": 0, "oldfieldtype": "Section Break", @@ -655,6 +656,30 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "fieldname": "is_frozen", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Is Frozen", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -794,7 +819,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-01-06 02:36:04.820353", + "modified": "2016-01-25 06:56:05.103168", "modified_by": "Administrator", "module": "Selling", "name": "Customer", @@ -984,5 +1009,6 @@ "read_only": 0, "read_only_onload": 0, "search_fields": "customer_name,customer_group,territory", + "sort_order": "ASC", "title_field": "customer_name" } \ No newline at end of file diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index 0bbe5348106..27db774bf48 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -7,7 +7,7 @@ import frappe import unittest from frappe.test_runner import make_test_records -from erpnext.exceptions import CustomerFrozen +from erpnext.exceptions import CustomerFrozen, CustomerDisabled test_ignore = ["Price List"] @@ -68,22 +68,38 @@ class TestCustomer(unittest.TestCase): frappe.rename_doc("Customer", "_Test Customer 1 Renamed", "_Test Customer 1") def test_freezed_customer(self): - make_test_records("Customer") make_test_records("Item") - + 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) - + self.assertRaises(CustomerFrozen, so.save) frappe.db.set_value("Customer", "_Test Customer", "is_frozen", 0) so.save() - + + def test_disabled_customer(self): + make_test_records("Item") + + frappe.db.set_value("Customer", "_Test Customer", "disabled", 1) + + from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + + so = make_sales_order(do_not_save=True) + + self.assertRaises(CustomerDisabled, so.save) + + frappe.db.set_value("Customer", "_Test Customer", "disabled", 0) + + so.save() + def test_duplicate_customer(self): + frappe.db.sql("delete from `tabCustomer` where customer_name='_Test Customer 1'") + if not frappe.db.get_value("Customer", "_Test Customer 1"): test_customer_1 = frappe.get_doc({ "customer_group": "_Test Customer Group", @@ -105,4 +121,4 @@ class TestCustomer(unittest.TestCase): self.assertEquals("_Test Customer 1", test_customer_1.name) self.assertEquals("_Test Customer 1 - 1", duplicate_customer.name) - self.assertEquals(test_customer_1.customer_name, duplicate_customer.customer_name) \ No newline at end of file + self.assertEquals(test_customer_1.customer_name, duplicate_customer.customer_name) From 2563f404d214af37c8069e9104224e9db4727d6b Mon Sep 17 00:00:00 2001 From: shreyas Date: Mon, 25 Jan 2016 17:44:09 +0530 Subject: [PATCH 2/7] [Minor Change] Updated queries.py --- erpnext/controllers/queries.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/controllers/queries.py b/erpnext/controllers/queries.py index e3f3f89c8da..6261e585cdc 100644 --- a/erpnext/controllers/queries.py +++ b/erpnext/controllers/queries.py @@ -217,7 +217,7 @@ def get_delivery_notes_to_be_billed(doctype, txt, searchfield, start, page_len, from `tabDelivery Note` where `tabDelivery Note`.`%(key)s` like %(txt)s and `tabDelivery Note`.docstatus = 1 and status not in ("Stopped", "Closed") %(fcond)s - and `tabDelivery Note`.per_billed < 100 + and (`tabDelivery Note`.per_billed < 100 or `tabDelivery Note`.grand_total = 0) %(mcond)s order by `tabDelivery Note`.`%(key)s` asc limit %(start)s, %(page_len)s""" % { "key": searchfield, From 323dc96c99e1e0c7b37885ed0a286d4eb74e82dd Mon Sep 17 00:00:00 2001 From: shreyas Date: Mon, 25 Jan 2016 17:59:44 +0530 Subject: [PATCH 3/7] [Travis] Fixed reference failure in party.py --- erpnext/accounts/party.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index b7478ae9fd8..691ee4644e8 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -10,7 +10,7 @@ from frappe.defaults import get_user_permissions from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff from erpnext.utilities.doctype.address.address import get_address_display from erpnext.utilities.doctype.contact.contact import get_contact_details -from erpnext.exceptions import CustomerFrozen, InvalidCurrency, CustomerDisabled +from erpnext.exceptions import CustomerFrozen, InvalidCurrency, CustomerDisabled, InvalidAccountCurrency class DuplicatePartyAccountError(frappe.ValidationError): pass From f76853a8d9bed57f5a3df997c1c6ff7658e08aa3 Mon Sep 17 00:00:00 2001 From: shreyas Date: Mon, 25 Jan 2016 21:25:11 +0530 Subject: [PATCH 4/7] [Minor]Changed CustomerDisabled and CustomerFrozen to PartyDisabled and PartyFrozen --- erpnext/accounts/party.py | 6 +++--- erpnext/buying/doctype/supplier/test_supplier.py | 4 ++-- erpnext/controllers/accounts_controller.py | 2 +- erpnext/exceptions.py | 4 ++-- erpnext/selling/doctype/customer/test_customer.py | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 691ee4644e8..70e141b0193 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -10,7 +10,7 @@ from frappe.defaults import get_user_permissions from frappe.utils import add_days, getdate, formatdate, get_first_day, date_diff from erpnext.utilities.doctype.address.address import get_address_display from erpnext.utilities.doctype.contact.contact import get_contact_details -from erpnext.exceptions import CustomerFrozen, InvalidCurrency, CustomerDisabled, InvalidAccountCurrency +from erpnext.exceptions import PartyFrozen, InvalidCurrency, PartyDisabled, InvalidAccountCurrency class DuplicatePartyAccountError(frappe.ValidationError): pass @@ -314,7 +314,7 @@ def validate_party_frozen_disabled(party, party_type): 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(party_type, party, "is_frozen"): - frappe.throw("{0} {1} is frozen".format(party_type, party), CustomerFrozen) + frappe.throw("{0} {1} is frozen".format(party_type, party), PartyFrozen) if frappe.db.get_value(party_type, party, "disabled"): - frappe.throw("{0} {1} is disabled".format(party_type, party), CustomerDisabled) + frappe.throw("{0} {1} is disabled".format(party_type, party), PartyDisabled) diff --git a/erpnext/buying/doctype/supplier/test_supplier.py b/erpnext/buying/doctype/supplier/test_supplier.py index cc551ac683a..a7a65f1dbd1 100644 --- a/erpnext/buying/doctype/supplier/test_supplier.py +++ b/erpnext/buying/doctype/supplier/test_supplier.py @@ -5,7 +5,7 @@ from __future__ import unicode_literals import frappe, unittest from erpnext.accounts.party import get_due_date -from erpnext.exceptions import CustomerFrozen, CustomerDisabled +from erpnext.exceptions import PartyFrozen, PartyDisabled from frappe.test_runner import make_test_records test_records = frappe.get_test_records('Supplier') @@ -65,7 +65,7 @@ class TestSupplier(unittest.TestCase): po = create_purchase_order(do_not_save=True) - self.assertRaises(CustomerDisabled, po.save) + self.assertRaises(PartyDisabled, po.save) frappe.db.set_value("Supplier", "_Test Supplier", "disabled", 0) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 12df9a79960..d6eff1cd570 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -11,7 +11,7 @@ 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 from erpnext.accounts.party import get_party_account_currency, validate_party_frozen_disabled -from erpnext.exceptions import CustomerFrozen, InvalidCurrency, CustomerDisabled +from erpnext.exceptions import InvalidCurrency force_item_fields = ("item_group", "barcode", "brand", "stock_uom") diff --git a/erpnext/exceptions.py b/erpnext/exceptions.py index 808523b0142..d92af5d7227 100644 --- a/erpnext/exceptions.py +++ b/erpnext/exceptions.py @@ -2,7 +2,7 @@ from __future__ import unicode_literals import frappe # accounts -class CustomerFrozen(frappe.ValidationError): pass +class PartyFrozen(frappe.ValidationError): pass class InvalidAccountCurrency(frappe.ValidationError): pass class InvalidCurrency(frappe.ValidationError): pass -class CustomerDisabled(frappe.ValidationError):pass +class PartyDisabled(frappe.ValidationError):pass diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py index 27db774bf48..53fcb1eb6ef 100644 --- a/erpnext/selling/doctype/customer/test_customer.py +++ b/erpnext/selling/doctype/customer/test_customer.py @@ -7,7 +7,7 @@ import frappe import unittest from frappe.test_runner import make_test_records -from erpnext.exceptions import CustomerFrozen, CustomerDisabled +from erpnext.exceptions import PartyFrozen, PartyDisabled test_ignore = ["Price List"] @@ -76,7 +76,7 @@ class TestCustomer(unittest.TestCase): so = make_sales_order(do_not_save= True) - self.assertRaises(CustomerFrozen, so.save) + self.assertRaises(PartyFrozen, so.save) frappe.db.set_value("Customer", "_Test Customer", "is_frozen", 0) @@ -91,7 +91,7 @@ class TestCustomer(unittest.TestCase): so = make_sales_order(do_not_save=True) - self.assertRaises(CustomerDisabled, so.save) + self.assertRaises(PartyDisabled, so.save) frappe.db.set_value("Customer", "_Test Customer", "disabled", 0) From c8ac3b042bc78adc7ae78d003895a6c9d8974a5d Mon Sep 17 00:00:00 2001 From: shreyas Date: Tue, 26 Jan 2016 13:23:38 +0530 Subject: [PATCH 5/7] [Minor]Refactored code for better readability --- erpnext/accounts/party.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 70e141b0193..59a6782f58a 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -311,10 +311,10 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup def validate_party_frozen_disabled(party, party_type): if party_type and 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(party_type, party, "is_frozen"): - frappe.throw("{0} {1} is frozen".format(party_type, party), PartyFrozen) - - if frappe.db.get_value(party_type, party, "disabled"): + party = frappe.db.get_value(party_type, party, ["is_frozen", "disabled"], as_dict=True) + if party.disabled: frappe.throw("{0} {1} is disabled".format(party_type, party), PartyDisabled) + elif party.is_frozen: + frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier') + if not frozen_accounts_modifier in frappe.get_roles(): + frappe.throw("{0} {1} is frozen".format(party_type, party), PartyFrozen) From 79872bf62c727bb795a2af2a1d19e13316716797 Mon Sep 17 00:00:00 2001 From: shreyas Date: Tue, 26 Jan 2016 13:57:06 +0530 Subject: [PATCH 6/7] [Refactor]Changed variable name to avoid conflict between args and local variable --- erpnext/accounts/party.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 59a6782f58a..60eb7700765 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -309,12 +309,12 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup return get_tax_template(posting_date, args) -def validate_party_frozen_disabled(party, party_type): - if party_type and party: - party = frappe.db.get_value(party_type, party, ["is_frozen", "disabled"], as_dict=True) +def validate_party_frozen_disabled(party_name, party_type): + if party_type and party_name: + party = frappe.db.get_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True) if party.disabled: - frappe.throw("{0} {1} is disabled".format(party_type, party), PartyDisabled) + frappe.throw("{0} {1} is disabled".format(party_type, party_name), PartyDisabled) elif party.is_frozen: frozen_accounts_modifier = frappe.db.get_value( 'Accounts Settings', None,'frozen_accounts_modifier') if not frozen_accounts_modifier in frappe.get_roles(): - frappe.throw("{0} {1} is frozen".format(party_type, party), PartyFrozen) + frappe.throw("{0} {1} is frozen".format(party_type, party_name), PartyFrozen) From eba9ca4d667b826668dbe2cd72d0e30c99f94ed8 Mon Sep 17 00:00:00 2001 From: shreyas Date: Tue, 26 Jan 2016 14:56:52 +0530 Subject: [PATCH 7/7] [Minor]Change to maintain args ordering convention --- erpnext/accounts/doctype/gl_entry/gl_entry.py | 2 +- erpnext/accounts/party.py | 2 +- erpnext/controllers/accounts_controller.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py index 34c87d5c908..b8446531f02 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.py +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py @@ -96,7 +96,7 @@ class GLEntry(Document): frappe.throw(_("Cost Center {0} does not belong to Company {1}").format(self.cost_center, self.company)) def validate_party(self): - validate_party_frozen_disabled(self.party, self.party_type) + validate_party_frozen_disabled(self.party_type, self.party) def validate_currency(self): company_currency = get_company_currency(self.company) diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index 60eb7700765..29ed02d47cc 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -309,7 +309,7 @@ def set_taxes(party, party_type, posting_date, company, customer_group=None, sup return get_tax_template(posting_date, args) -def validate_party_frozen_disabled(party_name, party_type): +def validate_party_frozen_disabled(party_type, party_name): if party_type and party_name: party = frappe.db.get_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True) if party.disabled: diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index d6eff1cd570..81e5f9e1da4 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -417,15 +417,15 @@ class AccountsController(TransactionBase): def validate_party(self): party_type, party = self.get_party() - validate_party_frozen_disabled(party, party_type) + validate_party_frozen_disabled(party_type, party) def get_party(self): party_type = None if self.doctype in ("Opportunity", "Quotation", "Sales Order", "Delivery Note", "Sales Invoice"): - party_type = 'Customer' + party_type = 'Customer' elif self.doctype in ("Supplier Quotation", "Purchase Order", "Purchase Receipt", "Purchase Invoice"): - party_type = 'Supplier' + party_type = 'Supplier' elif self.meta.get_field("customer"): party_type = "Customer"