Merge branch 'staging' into develop
diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html
index f26cd33..dfcf64c 100644
--- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html
+++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html
@@ -230,7 +230,7 @@
{% } %}
<td style="text-align: right">{%= format_currency(data[i][("total_invoiced_amt")], data[i]["currency"]) %}</td>
<td style="text-align: right">{%= format_currency(data[i][("total_paid_amt")], data[i]["currency"]) %}</td>
- <td style="text-align: right">{%= report.report_name === "Accounts Receivable Summary" ? format_currency(data[i][__("Credit Note Amt")], data[i]["currency"]) : format_currency(data[i][__("Debit Note Amt")], data[i]["currency"]) %}</td>
+ <td style="text-align: right">{%= report.report_name === "Accounts Receivable Summary" ? format_currency(data[i][__("credit_note_amt")], data[i]["currency"]) : format_currency(data[i][__("debit_note_amt")], data[i]["currency"]) %}</td>
<td style="text-align: right">{%= format_currency(data[i][("total_outstanding_amt")], data[i]["currency"]) %}</td>
{% } %}
{% } %}
diff --git a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
index c56ae0d..7b0072c 100644
--- a/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
+++ b/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py
@@ -3,7 +3,7 @@
from __future__ import unicode_literals
import frappe
-from frappe import _
+from frappe import _, scrub
from frappe.utils import flt
from erpnext.accounts.report.accounts_receivable.accounts_receivable import ReceivablePayableReport
@@ -21,24 +21,92 @@
if party_naming_by == "Naming Series":
columns += [ args.get("party_type") + " Name::140"]
- credit_debit_label = _("Credit Note Amt") if args.get('party_type') == 'Customer' else _("Debit Note Amt")
+ credit_debit_label = "Credit Note Amt" if args.get('party_type') == 'Customer' else "Debit Note Amt"
+
+ columns += [{
+ "label": _("Total Invoiced Amt"),
+ "fieldname": "total_invoiced_amt",
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 100
+ },
+ {
+ "label": _("Total Paid Amt"),
+ "fieldname": "total_paid_amt",
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 100
+ }]
+
columns += [
- _("Total Invoiced Amt") + ":Currency/currency:140",
- _("Total Paid Amt") + ":Currency/currency:140",
- credit_debit_label + ":Currency/currency:140",
- _("Total Outstanding Amt") + ":Currency/currency:160",
- "0-" + str(self.filters.range1) + ":Currency/currency:100",
- str(self.filters.range1) + "-" + str(self.filters.range2) + ":Currency/currency:100",
- str(self.filters.range2) + "-" + str(self.filters.range3) + ":Currency/currency:100",
- str(self.filters.range3) + _("-Above") + ":Currency/currency:100"]
+ {
+ "label": _(credit_debit_label),
+ "fieldname": scrub(credit_debit_label),
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 140
+ },
+ {
+ "label": _("Total Outstanding Amt"),
+ "fieldname": "total_outstanding_amt",
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 160
+ },
+ {
+ "label": _("0-" + str(self.filters.range1)),
+ "fieldname": scrub("0-" + str(self.filters.range1)),
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 160
+ },
+ {
+ "label": _(str(self.filters.range1) + "-" + str(self.filters.range2)),
+ "fieldname": scrub(str(self.filters.range1) + "-" + str(self.filters.range2)),
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 160
+ },
+ {
+ "label": _(str(self.filters.range2) + "-" + str(self.filters.range3)),
+ "fieldname": scrub(str(self.filters.range2) + "-" + str(self.filters.range3)),
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 160
+ },
+ {
+ "label": _(str(self.filters.range3) + _("-Above")),
+ "fieldname": scrub(str(self.filters.range3) + _("-Above")),
+ "fieldtype": "Currency",
+ "options": "currency",
+ "width": 160
+ }
+ ]
if args.get("party_type") == "Customer":
- columns += [
- _("Territory") + ":Link/Territory:80",
- _("Customer Group") + ":Link/Customer Group:120"
- ]
+ columns += [{
+ "label": _("Territory"),
+ "fieldname": "territory",
+ "fieldtype": "Link",
+ "options": "Territory",
+ "width": 80
+ },
+ {
+ "label": _("Customer Group"),
+ "fieldname": "customer_group",
+ "fieldtype": "Link",
+ "options": "Customer Group",
+ "width": 80
+ }]
+
if args.get("party_type") == "Supplier":
- columns += [_("Supplier Group") + ":Link/Supplier Group:80"]
+ columns += [{
+ "label": _("Supplier Group"),
+ "fieldname": "supplier_group",
+ "fieldtype": "Link",
+ "options": "Supplier Group",
+ "width": 80
+ }]
columns.append({
"fieldname": "currency",
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 7016b72..0ada686 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -12,7 +12,7 @@
source_link = "https://github.com/frappe/erpnext"
develop_version = '12.x.x-develop'
-staging_version = '11.0.3-beta.23'
+staging_version = '11.0.3-beta.24'
error_report_email = "support@erpnext.com"
diff --git a/erpnext/patches/v11_0/update_total_qty_field.py b/erpnext/patches/v11_0/update_total_qty_field.py
index 749e24f..8f08699 100644
--- a/erpnext/patches/v11_0/update_total_qty_field.py
+++ b/erpnext/patches/v11_0/update_total_qty_field.py
@@ -14,7 +14,7 @@
"Purchase Order", "Purchase Invoice", "Purchase Receipt", "Quotation", "Supplier Quotation"]
for doctype in doctypes:
- total_qty = frappe.db.sql('''
+ total_qty = frappe.db.sql('''
SELECT
parent, SUM(qty) as qty
FROM
@@ -22,14 +22,25 @@
GROUP BY parent
''' % (doctype), as_dict = True)
- when_then = []
- for d in total_qty:
- when_then.append("""
- when dt.name = {0} then {1}
- """.format(frappe.db.escape(d.get("parent")), d.get("qty")))
+ # Query to update total_qty might become too big, Update in batches
+ # batch_size is chosen arbitrarily, Don't try too hard to reason about it
+ batch_size = 100000
+ for i in range(0, len(total_qty), batch_size):
+ batch_transactions = total_qty[i:i + batch_size]
- if when_then:
- frappe.db.sql('''
- UPDATE
- `tab%s` dt SET dt.total_qty = CASE %s ELSE 0.0 END
- ''' % (doctype, " ".join(when_then)))
\ No newline at end of file
+ # UPDATE with CASE for some reason cannot use PRIMARY INDEX,
+ # causing all rows to be examined, leading to a very slow update
+
+ # UPDATE with WHERE clause uses PRIMARY INDEX, but will lead to too many queries
+
+ # INSERT with ON DUPLICATE KEY UPDATE uses PRIMARY INDEX
+ # and can perform multiple updates per query
+ # This is probably never used anywhere else as of now, but should be
+ values = []
+ for d in batch_transactions:
+ values.append("('{}', {})".format(d.parent, d.qty))
+ conditions = ",".join(values)
+ frappe.db.sql("""
+ INSERT INTO `tab{}` (name, total_qty) VALUES {}
+ ON DUPLICATE KEY UPDATE name = VALUES(name), total_qty = VALUES(total_qty)
+ """.format(doctype, conditions))