From aaf378e3400f2ad5f9738791f8d80ddf8b79a2d1 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 13 Dec 2017 18:40:52 +0530 Subject: [PATCH 1/3] Validate numeric attribute value based on range defined in template (#11981) --- erpnext/controllers/item_variant.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/erpnext/controllers/item_variant.py b/erpnext/controllers/item_variant.py index f40d519b92..27a2a3a90a 100644 --- a/erpnext/controllers/item_variant.py +++ b/erpnext/controllers/item_variant.py @@ -56,7 +56,7 @@ def validate_item_variant_attributes(item, args=None): if not args: args = {d.attribute.lower():d.attribute_value for d in item.attributes} - attribute_values, numeric_values = get_attribute_values() + attribute_values, numeric_values = get_attribute_values(item) for attribute, value in args.items(): if not value: @@ -96,16 +96,17 @@ def validate_item_attribute_value(attributes_list, attribute, attribute_value, i frappe.throw(_("Value {0} for Attribute {1} does not exist in the list of valid Item Attribute Values for Item {2}").format( attribute_value, attribute, item), InvalidItemAttributeValueError, title=_('Invalid Attribute')) -def get_attribute_values(): +def get_attribute_values(item): if not frappe.flags.attribute_values: attribute_values = {} numeric_values = {} for t in frappe.get_all("Item Attribute Value", fields=["parent", "attribute_value"]): attribute_values.setdefault(t.parent.lower(), []).append(t.attribute_value) - for t in frappe.get_all('Item Attribute', - fields=["name", "from_range", "to_range", "increment"], filters={'numeric_values': 1}): - numeric_values[t.name.lower()] = t + for t in frappe.get_all('Item Variant Attribute', + fields=["attribute", "from_range", "to_range", "increment"], + filters={'numeric_values': 1, 'parent': item.variant_of}): + numeric_values[t.attribute.lower()] = t frappe.flags.attribute_values = attribute_values frappe.flags.numeric_values = numeric_values From d6cb61752068b881130294eb7f022dbc6f7b19b3 Mon Sep 17 00:00:00 2001 From: Pawan Mehta Date: Thu, 14 Dec 2017 18:04:31 +0530 Subject: [PATCH 2/3] Fix 11948 - Sales Payment Summary (#11950) * [fix] #11948 * [fix] #11948 * [fix] #11948 * codacy issues --- .../sales_payment_summary.js | 21 +------ .../sales_payment_summary.py | 63 +++++++++++++------ 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.js b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.js index 6b462144cd..a01cc0f943 100644 --- a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.js +++ b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.js @@ -1,6 +1,5 @@ // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt - frappe.query_reports["Sales Payment Summary"] = { "filters": [ { @@ -23,12 +22,6 @@ frappe.query_reports["Sales Payment Summary"] = { "options": "Company", "default": frappe.defaults.get_user_default("Company") }, - { - "fieldname":"mode_of_payment", - "label": __("Mode of Payment"), - "fieldtype": "Link", - "options": "Mode of Payment" - }, { "fieldname":"owner", "label": __("Owner"), @@ -36,22 +29,10 @@ frappe.query_reports["Sales Payment Summary"] = { "options": "User", "defaults": user }, - { - "fieldname":"cost_center", - "label": __("Cost Center"), - "fieldtype": "Link", - "options": "Cost Center" - }, - { - "fieldname":"warehouse", - "label": __("Warehouse"), - "fieldtype": "Link", - "options": "Warehouse" - }, { "fieldname":"is_pos", "label": __("POS?"), "fieldtype": "Check" } ] -}; +}; \ No newline at end of file diff --git a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py index bb80955a6b..b46f1bea0f 100644 --- a/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py +++ b/erpnext/accounts/report/sales_payment_summary/sales_payment_summary.py @@ -1,9 +1,9 @@ # Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors # For license information, please see license.txt - from __future__ import unicode_literals import frappe from frappe import _ +from frappe.utils import cstr def execute(filters=None): columns, data = [], [] @@ -15,22 +15,23 @@ def get_columns(): return [ _("Date") + ":Date:80", _("Owner") + "::150", - _("Payment Mode") + "::120", - _("Warehouse") + ":Link/Cost Center:100", - _("Cost Center") + ":Link/Warehouse:100", + _("Payment Mode") + "::140", _("Sales and Returns") + ":Currency/currency:120", _("Taxes") + ":Currency/currency:120", _("Payments") + ":Currency/currency:120", - _("Reconciliation") + ":Currency/currency:120" + _("Outstanding Amount") + ":Currency/currency:150", ] def get_sales_payment_data(filters, columns): sales_invoice_data = get_sales_invoice_data(filters) data = [] + mode_of_payments = get_mode_of_payments(filters) for inv in sales_invoice_data: - row = [inv.posting_date, inv.owner, inv.mode_of_payment,inv.warehouse, - inv.cost_center,inv.net_total, inv.total_taxes, inv.paid_amount, - (inv.net_total + inv.total_taxes - inv.paid_amount)] + mode_of_payment = inv["owner"]+cstr(inv["posting_date"]) + row = [inv.posting_date, inv.owner,", ".join(mode_of_payments.get(mode_of_payment, [])), + inv.net_total, + inv.total_taxes, (inv.net_total + inv.total_taxes - inv.outstanding_amount), + inv.outstanding_amount] data.append(row) return data @@ -41,26 +42,48 @@ def get_conditions(filters): if filters.get("owner"): conditions += " and a.owner = %(owner)s" if filters.get("from_date"): conditions += " and a.posting_date >= %(from_date)s" if filters.get("to_date"): conditions += " and a.posting_date <= %(to_date)s" - if filters.get("mode_of_payment"): conditions += " and c.mode_of_payment >= %(mode_of_payment)s" - if filters.get("warehouse"): conditions += " and b.warehouse <= %(warehouse)s" - if filters.get("cost_center"): conditions += " and b.cost_center <= %(cost_center)s" if filters.get("is_pos"): conditions += " and a.is_pos = %(is_pos)s" - return conditions def get_sales_invoice_data(filters): conditions = get_conditions(filters) return frappe.db.sql(""" select - a.owner, a.posting_date, c.mode_of_payment, b.warehouse, b.cost_center, + a.posting_date, a.owner, sum(a.net_total) as "net_total", sum(a.total_taxes_and_charges) as "total_taxes", - sum(a.base_paid_amount) as "paid_amount" - from `tabSales Invoice` a, `tabSales Invoice Item` b, `tabSales Invoice Payment` c - where - a.name = b.parent - and a.name = c.parent + sum(a.base_paid_amount) as "paid_amount", + sum(a.outstanding_amount) as "outstanding_amount" + from `tabSales Invoice` a + where a.docstatus = 1 and {conditions} group by - a.owner, a.posting_date, c.mode_of_payment, b.warehouse, b.cost_center - """.format(conditions=conditions), filters, as_dict=1) \ No newline at end of file + a.owner, a.posting_date + """.format(conditions=conditions), filters, as_dict=1) + +def get_mode_of_payments(filters): + mode_of_payments = {} + invoice_list = get_invoices(filters) + invoice_list_names = ",".join(['"' + invoice['name'] + '"' for invoice in invoice_list]) + if invoice_list: + inv_mop = frappe.db.sql("""select a.owner,a.posting_date,b.mode_of_payment + from `tabSales Invoice` a, `tabSales Invoice Payment` b + where a.name = b.parent + and a.name in ({invoice_list_names}) + union + select a.owner,a.posting_date,b.mode_of_payment + from `tabSales Invoice` a, `tabPayment Entry` b,`tabPayment Entry Reference` c + where a.name = c.reference_name + and b.name = c.parent + and a.name in ({invoice_list_names}) + """.format(invoice_list_names=invoice_list_names), as_dict=1) + for d in inv_mop: + mode_of_payments.setdefault(d["owner"]+cstr(d["posting_date"]), []).append(d.mode_of_payment) + return mode_of_payments + +def get_invoices(filters): + conditions = get_conditions(filters) + return frappe.db.sql("""select a.name + from `tabSales Invoice` a + where a.docstatus = 1 and {conditions}""".format(conditions=conditions), + filters, as_dict=1) \ No newline at end of file From 2f22d2b30793fe5a27295a18447fbbda217213e7 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Fri, 15 Dec 2017 13:23:54 +0600 Subject: [PATCH 3/3] bumped to version 9.2.23 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 04f881c634..d8ee999a74 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -4,7 +4,7 @@ import inspect import frappe from erpnext.hooks import regional_overrides -__version__ = '9.2.22' +__version__ = '9.2.23' def get_default_company(user=None): '''Get default company for user'''