diff --git a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py index a8365aa4b3..41e70eb20d 100644 --- a/erpnext/accounts/doctype/journal_voucher/journal_voucher.py +++ b/erpnext/accounts/doctype/journal_voucher/journal_voucher.py @@ -38,10 +38,10 @@ class JournalVoucher(AccountsController): self.set_print_format_fields() self.validate_against_sales_order() self.validate_against_purchase_order() - self.check_credit_limit() self.check_credit_days() def on_submit(self): + self.check_credit_limit() self.make_gl_entries() self.update_advance_paid() @@ -73,8 +73,8 @@ class JournalVoucher(AccountsController): check_credit_limit(customer, self.company) def check_credit_days(self): + from erpnext.accounts.party import get_credit_days posting_date = self.posting_date - company_credit_days = frappe.db.get_value("Company", self.company, "credit_days") if self.cheque_date: for d in self.get("entries"): if d.party_type and d.party and d.get("credit" if d.party_type=="Customer" else "debit") > 0: @@ -83,11 +83,12 @@ class JournalVoucher(AccountsController): elif d.against_voucher: posting_date = frappe.db.get_value("Purchase Invoice", d.against_voucher, "posting_date") - credit_days = frappe.db.get_value(d.party_type, d.party, "credit_days") or company_credit_days + credit_days = get_credit_days(d.party_type, d.party, self.company) if credit_days: - if (getdate(self.cheque_date) - getdate(posting_date)).days > flt(credit_days): - msgprint(_("Note: Reference Date is after allowed credit days {0} for {1} {2}") - .format(credit_days, d.party_type, d.party)) + date_diff = (getdate(self.cheque_date) - getdate(posting_date)).days + if date_diff > flt(credit_days): + msgprint(_("Note: Reference Date exceeds allowed credit days by {0} days for {1} {2}") + .format(date_diff, d.party_type, d.party)) def validate_cheque_info(self): if self.voucher_type in ['Bank Voucher']: diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index c423ea36ca..53869c43b1 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -147,9 +147,15 @@ def get_due_date(posting_date, party_type, party, company): return due_date -def get_credit_days(self, party_type, party, company): - return frappe.db.get_value(party_type, party, "credit_days") or \ - frappe.db.get_value("Company", company, "credit_days") if company else 0 +def get_credit_days(party_type, party, company): + party_group_doctype = "Customer Group" if party_type=="Customer" else "Supplier Type" + credit_days, party_group = frappe.db.get_value(party_type, party, ["credit_days", frappe.scrub(party_group_doctype)]) + + if not credit_days: + credit_days = frappe.db.get_value(party_group_doctype, party_group, "credit_days") or \ + frappe.db.get_value("Company", company, "credit_days") + + return credit_days def validate_due_date(posting_date, due_date, party_type, party, company): credit_days = get_credit_days(party_type, party, company) @@ -164,8 +170,8 @@ def validate_due_date(posting_date, due_date, party_type, party, company): "credit_controller") in frappe.user.get_roles() if is_credit_controller: - msgprint(_("Note: Due / Reference Date exceeds the allowed credit days by {0} day(s)").format( - diff - flt(credit_days))) + msgprint(_("Note: Due / Reference Date exceeds allowed customer credit days by {0} day(s)") + .format(diff - flt(credit_days))) else: max_due_date = formatdate(add_days(posting_date, credit_days)) frappe.throw(_("Due / Reference Date cannot be after {0}").format(max_due_date)) diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index c6d0aaaa2b..4d0642c0c5 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -152,9 +152,7 @@ def get_customer_list(doctype, txt, searchfield, start, page_len, filters): def check_credit_limit(customer, company): customer_outstanding = get_customer_outstanding(customer, company) - credit_limit = frappe.db.get_value("Customer", customer, "credit_limit") or \ - frappe.db.get_value('Company', company, 'credit_limit') - + credit_limit = get_credit_limit(customer, company) if credit_limit > 0 and flt(customer_outstanding) > credit_limit: msgprint(_("Credit limit has been crossed for customer {0} {1}/{2}") .format(customer, customer_outstanding, credit_limit)) @@ -186,9 +184,9 @@ def get_customer_outstanding(customer, company): select sum( ( - (ifnull(dn_item.amount) - (select sum(ifnull(amount, 0)) + (ifnull(dn_item.amount, 0) - ifnull((select sum(ifnull(amount, 0)) from `tabSales Invoice Item` - where ifnull(dn_detail, '') = dn_item.name and docstatus = 1) + where ifnull(dn_detail, '') = dn_item.name and docstatus = 1), 0) )/dn.net_total )*dn.grand_total ) @@ -198,10 +196,19 @@ def get_customer_outstanding(customer, company): and dn.docstatus = 1 and dn.status != 'Stopped' and ifnull(dn_item.against_sales_order, '') = '' and ifnull(dn_item.against_sales_invoice, '') = '' - and ifnull(dn_item.amount) > (select sum(ifnull(amount, 0)) + and ifnull(dn_item.amount, 0) > ifnull((select sum(ifnull(amount, 0)) from `tabSales Invoice Item` - where ifnull(dn_detail, '') = dn_item.name and docstatus = 1)""", (customer, company)) + where ifnull(dn_detail, '') = dn_item.name and docstatus = 1), 0)""", (customer, company)) outstanding_based_on_dn = flt(outstanding_based_on_dn[0][0]) if outstanding_based_on_dn else 0.0 return outstanding_based_on_gle + outstanding_based_on_so + outstanding_based_on_dn + + +def get_credit_limit(customer, company): + credit_limit, customer_group = frappe.db.get_value("Customer", customer, ["credit_limit", "customer_group"]) + if not credit_limit: + credit_limit = frappe.db.get_value("Customer Group", customer_group, "credit_limit") or \ + frappe.db.get_value("Company", company, "credit_limit") + + return credit_limit diff --git a/erpnext/setup/doctype/customer_group/customer_group.json b/erpnext/setup/doctype/customer_group/customer_group.json index 47ee903814..7490158261 100644 --- a/erpnext/setup/doctype/customer_group/customer_group.json +++ b/erpnext/setup/doctype/customer_group/customer_group.json @@ -56,6 +56,18 @@ "options": "Price List", "permlevel": 0 }, + { + "fieldname": "credit_days", + "fieldtype": "Int", + "label": "Credit Days", + "permlevel": 1 + }, + { + "fieldname": "credit_limit", + "fieldtype": "Currency", + "label": "Credit Limit", + "permlevel": 1 + }, { "fieldname": "lft", "fieldtype": "Int", @@ -101,7 +113,7 @@ "icon": "icon-sitemap", "idx": 1, "in_create": 1, - "modified": "2014-05-27 03:49:09.397308", + "modified": "2014-08-27 17:41:35.154380", "modified_by": "Administrator", "module": "Setup", "name": "Customer Group", @@ -146,6 +158,23 @@ "role": "Sales Master Manager", "submit": 0, "write": 1 + }, + { + "permlevel": 1, + "read": 1, + "role": "Sales Master Manager", + "write": 1 + }, + { + "permlevel": 1, + "read": 1, + "role": "Sales User" + }, + { + "permlevel": 1, + "read": 1, + "role": "Sales Manager", + "write": 0 } ], "read_only": 1, diff --git a/erpnext/setup/doctype/supplier_type/supplier_type.json b/erpnext/setup/doctype/supplier_type/supplier_type.json index e881e95cda..e44e9a80a5 100644 --- a/erpnext/setup/doctype/supplier_type/supplier_type.json +++ b/erpnext/setup/doctype/supplier_type/supplier_type.json @@ -16,11 +16,17 @@ "oldfieldtype": "Data", "permlevel": 0, "reqd": 1 + }, + { + "fieldname": "credit_days", + "fieldtype": "Int", + "label": "Credit Days", + "permlevel": 1 } ], "icon": "icon-flag", "idx": 1, - "modified": "2014-05-27 03:49:20.505739", + "modified": "2014-08-27 17:43:31.479133", "modified_by": "Administrator", "module": "Setup", "name": "Supplier Type", @@ -65,6 +71,22 @@ "role": "Purchase Master Manager", "submit": 0, "write": 1 + }, + { + "permlevel": 1, + "read": 1, + "role": "Purchase Master Manager", + "write": 1 + }, + { + "permlevel": 1, + "read": 1, + "role": "Purchase Manager" + }, + { + "permlevel": 1, + "read": 1, + "role": "Purchase User" } ] } \ No newline at end of file diff --git a/erpnext/stock/doctype/warehouse/warehouse.py b/erpnext/stock/doctype/warehouse/warehouse.py index b464083887..3939b8911c 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.py +++ b/erpnext/stock/doctype/warehouse/warehouse.py @@ -9,7 +9,6 @@ from frappe import throw, msgprint, _ from frappe.model.document import Document class Warehouse(Document): - def autoname(self): suffix = " - " + frappe.db.get_value("Company", self.company, "abbr") if not self.warehouse_name.endswith(suffix): @@ -22,7 +21,6 @@ class Warehouse(Document): self.update_parent_account() def update_parent_account(self): - if not getattr(self, "__islocal", None) \ and (self.create_account_under != frappe.db.get_value("Warehouse", self.name, "create_account_under")):