From d57b57a21d2ddfc52f09487718b167a905014c65 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 9 Dec 2014 11:55:59 +0530 Subject: [PATCH 1/2] Minor fix in accounts receivable report --- .../accounts_receivable.py | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index 3dc81d1341..a2ed86da15 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -13,17 +13,17 @@ class AccountsReceivableReport(object): self.age_as_on = getdate(nowdate()) \ if self.filters.report_date > getdate(nowdate()) \ else self.filters.report_date - + def run(self): customer_naming_by = frappe.db.get_value("Selling Settings", None, "cust_master_name") return self.get_columns(customer_naming_by), self.get_data(customer_naming_by) - + def get_columns(self, customer_naming_by): columns = [ _("Posting Date") + ":Date:80", _("Account") + ":Link/Account:150", _("Voucher Type") + "::110", _("Voucher No") + ":Dynamic Link/Voucher Type:120", - _("Due Date") + ":Date:80", - _("Invoiced Amount") + ":Currency:100", _("Payment Received") + ":Currency:100", + _("Due Date") + ":Date:80", + _("Invoiced Amount") + ":Currency:100", _("Payment Received") + ":Currency:100", _("Outstanding Amount") + ":Currency:100", _("Age") + ":Int:50", "0-30:Currency:100", "30-60:Currency:100", "60-90:Currency:100", _("90-Above") + ":Currency:100", _("Customer") + ":Link/Customer:200" @@ -69,27 +69,27 @@ class AccountsReceivableReport(object): # returns a distinct list return list(set([(e.voucher_type, e.voucher_no) for e in self.get_gl_entries() if getdate(e.posting_date) > report_date])) - + def get_entries_till(self, report_date): # returns a generator - return (e for e in self.get_gl_entries() + return (e for e in self.get_gl_entries() if getdate(e.posting_date) <= report_date) - + def is_receivable(self, gle, future_vouchers): return ( # advance - (not gle.against_voucher) or + (not gle.against_voucher) or # against sales order (gle.against_voucher_type == "Sales Order") or - + # sales invoice - (gle.against_voucher==gle.voucher_no and gle.debit > 0) or - + (gle.against_voucher==gle.voucher_no and gle.debit > 0) or + # entries adjusted with future vouchers ((gle.against_voucher_type, gle.against_voucher) in future_vouchers) ) - + def get_outstanding_amount(self, gle, report_date): payment_received = 0.0 for e in self.get_gl_entries_for(gle.account, gle.voucher_type, gle.voucher_no): @@ -97,7 +97,7 @@ class AccountsReceivableReport(object): payment_received += (flt(e.credit) - flt(e.debit)) return flt(gle.debit) - flt(gle.credit) - payment_received - + def get_customer(self, account): return self.get_account_map().get(account, {}).get("customer") or "" @@ -106,25 +106,25 @@ class AccountsReceivableReport(object): def get_territory(self, account): return self.get_account_map().get(account, {}).get("territory") or "" - + def get_account_map(self): if not hasattr(self, "account_map"): - self.account_map = dict(((r.name, r) for r in frappe.db.sql("""select + self.account_map = dict(((r.name, r) for r in frappe.db.sql("""select acc.name, cust.name as customer, cust.customer_name, cust.territory - from `tabAccount` acc left join `tabCustomer` cust + from `tabAccount` acc left join `tabCustomer` cust on cust.name=acc.master_name where acc.master_type="Customer" """, as_dict=True))) - + return self.account_map - + def get_due_date(self, gle): if not hasattr(self, "invoice_due_date_map"): # TODO can be restricted to posting date self.invoice_due_date_map = dict(frappe.db.sql("""select name, due_date from `tabSales Invoice` where docstatus=1""")) - + return gle.voucher_type == "Sales Invoice" \ and self.invoice_due_date_map.get(gle.voucher_no) or "" - + def get_gl_entries(self): if not hasattr(self, "gl_entries"): conditions, values = self.prepare_conditions() @@ -132,15 +132,15 @@ class AccountsReceivableReport(object): where docstatus < 2 {0} order by posting_date, account""".format(conditions), values, as_dict=True) return self.gl_entries - + def prepare_conditions(self): conditions = [""] values = {} - + if self.filters.company: conditions.append("company=%(company)s") values["company"] = self.filters.company - + if self.filters.account: conditions.append("account=%(account)s") values["account"] = self.filters.account @@ -149,11 +149,11 @@ class AccountsReceivableReport(object): if not account_map: frappe.throw(_("No Customer Accounts found.")) else: - accounts_list = ['"{0}"'.format(ac) for ac in account_map] + accounts_list = ['"{0}"'.format(ac.replace('"', '\"')) for ac in account_map] conditions.append("account in ({0})".format(", ".join(accounts_list))) - + return " and ".join(conditions), values - + def get_gl_entries_for(self, account, against_voucher_type, against_voucher): if not hasattr(self, "gl_entries_map"): self.gl_entries_map = {} @@ -163,7 +163,7 @@ class AccountsReceivableReport(object): .setdefault(gle.against_voucher_type, {})\ .setdefault(gle.against_voucher, [])\ .append(gle) - + return self.gl_entries_map.get(account, {})\ .get(against_voucher_type, {})\ .get(against_voucher, []) @@ -176,15 +176,15 @@ def get_ageing_data(age_as_on, entry_date, outstanding_amount): outstanding_range = [0.0, 0.0, 0.0, 0.0] if not (age_as_on and entry_date): return [0] + outstanding_range - + age = (getdate(age_as_on) - getdate(entry_date)).days or 0 index = None for i, days in enumerate([30, 60, 90]): if age <= days: index = i break - + if index is None: index = 3 outstanding_range[index] = outstanding_amount - + return [age] + outstanding_range From 7887ccb441fc5978e8538c07cc0b8815f9a9230b Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 9 Dec 2014 14:34:14 +0530 Subject: [PATCH 2/2] Credit days fix --- erpnext/accounts/doctype/account/account.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py index 7195db8a94..3874ac2146 100644 --- a/erpnext/accounts/doctype/account/account.py +++ b/erpnext/accounts/doctype/account/account.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals import frappe -from frappe.utils import flt, cstr, cint, getdate, add_days, formatdate +from frappe.utils import flt, cstr, cint, getdate from frappe import msgprint, throw, _ from frappe.model.document import Document @@ -176,15 +176,7 @@ class Account(Document): frappe.throw(_("Due Date cannot be before Posting Date")) elif credit_days is not None and diff > credit_days: - is_credit_controller = frappe.db.get_value("Accounts Settings", None, - "credit_controller") in frappe.user.get_roles() - - if is_credit_controller: - msgprint(_("Note: Due Date exceeds the allowed credit days by {0} day(s)").format( - diff - credit_days)) - else: - max_due_date = formatdate(add_days(posting_date, credit_days)) - frappe.throw(_("Due Date cannot be after {0}").format(max_due_date)) + msgprint(_("Note: Due Date exceeds the allowed credit days by {0} day(s)").format(diff - credit_days)) def validate_trash(self): """checks gl entries and if child exists"""