Merge branch 'master' into develop
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index fdd74e8..f07e9f2 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
 from erpnext.hooks import regional_overrides
 from frappe.utils import getdate
 
-__version__ = '9.2.22'
+__version__ = '9.2.23'
 
 def get_default_company(user=None):
 	'''Get default company for user'''
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 6b46214..a01cc0f 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": [
 		{
@@ -24,12 +23,6 @@
 			"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"),
 			"fieldtype": "Link",
@@ -37,21 +30,9 @@
 			"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 bb80955..b46f1be 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 @@
 	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 @@
 	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
diff --git a/erpnext/controllers/item_variant.py b/erpnext/controllers/item_variant.py
index 9817f0f..9eee6cc 100644
--- a/erpnext/controllers/item_variant.py
+++ b/erpnext/controllers/item_variant.py
@@ -56,7 +56,7 @@
 	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 @@
 		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