diff --git a/erpnext/accounts/report/daily_sales_payment_summary/__init__.py b/erpnext/accounts/report/daily_sales_payment_summary/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/erpnext/accounts/report/daily_sales_payment_summary/__init__.py
+++ /dev/null
diff --git a/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.js b/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.js
deleted file mode 100644
index 0426e0a..0000000
--- a/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.js
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-// License: GNU General Public License v3. See license.txt
-
-frappe.query_reports["Daily Sales Payment Summary"] = {
-	"filters": [
-		{
-			"fieldname":"from_date",
-			"label": __("From Date"),
-			"fieldtype": "Date",
-			"default": frappe.datetime.get_today(),
-			"width": "80"
-		},
-		{
-			"fieldname":"to_date",
-			"label": __("To Date"),
-			"fieldtype": "Date",
-			"default": frappe.datetime.get_today()
-		},
-		{
-			"fieldname":"customer",
-			"label": __("Customer"),
-			"fieldtype": "Link",
-			"options": "Customer"
-		},
-		{
-			"fieldname":"company",
-			"label": __("Company"),
-			"fieldtype": "Link",
-			"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"),
-			"fieldtype": "Link",
-			"options": "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"
-		}
-	]
-}
diff --git a/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.json b/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.json
deleted file mode 100644
index 0d43fd1..0000000
--- a/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "add_total_row": 0, 
- "apply_user_permissions": 1, 
- "creation": "2017-11-02 00:28:38.519057", 
- "disabled": 0, 
- "docstatus": 0, 
- "doctype": "Report", 
- "idx": 0, 
- "is_standard": "Yes", 
- "modified": "2017-11-02 10:39:56.984273", 
- "modified_by": "Administrator", 
- "module": "Accounts", 
- "name": "Daily Sales Payment Summary", 
- "owner": "Administrator", 
- "ref_doctype": "Sales Invoice", 
- "report_name": "Daily Sales Payment Summary", 
- "report_type": "Script Report", 
- "roles": [
-  {
-   "role": "Accounts Manager"
-  }, 
-  {
-   "role": "Accounts User"
-  }
- ]
-}
\ No newline at end of file
diff --git a/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.py b/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.py
deleted file mode 100644
index 76d25d0..0000000
--- a/erpnext/accounts/report/daily_sales_payment_summary/daily_sales_payment_summary.py
+++ /dev/null
@@ -1,233 +0,0 @@
-# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
-# License: GNU General Public License v3. See license.txt
-
-from __future__ import unicode_literals
-import frappe
-from frappe.utils import flt
-from frappe import msgprint, _
-
-def execute(filters=None):
-	return _execute(filters)
-
-def _execute(filters, additional_table_columns=None, additional_query_columns=None):
-	if not filters: filters = frappe._dict({})
-
-	invoice_list = get_invoices(filters, additional_query_columns)
-	columns, income_accounts, tax_accounts = get_columns(invoice_list, additional_table_columns)
-
-	if not invoice_list:
-		msgprint(_("No record found"))
-		return columns, invoice_list
-
-	invoice_income_map = get_invoice_income_map(invoice_list)
-	invoice_income_map, invoice_tax_map = get_invoice_tax_map(invoice_list,
-		invoice_income_map, income_accounts)
-	#Cost Center & Warehouse Map
-	invoice_cc_wh_map = get_invoice_cc_wh_map(invoice_list)
-	customers = list(set([inv.customer for inv in invoice_list]))
-	customer_map = get_customer_details(customers)
-	company_currency = frappe.db.get_value("Company", filters.get("company"), "default_currency")
-	mode_of_payments = get_mode_of_payments([inv.name for inv in invoice_list])
-
-	data = []
-	for inv in invoice_list:
-		# invoice details
-		cost_center = list(set(invoice_cc_wh_map.get(inv.name, {}).get("cost_center", [])))
-		warehouse = list(set(invoice_cc_wh_map.get(inv.name, {}).get("warehouse", [])))
-
-		customer_details = customer_map.get(inv.customer, {})
-		row = [
-			inv.name, inv.posting_date, inv.customer, inv.customer_name
-		]
-
-		if additional_query_columns:
-			for col in additional_query_columns:
-				row.append(inv.get(col))
-
-		row +=[
-			", ".join(mode_of_payments.get(inv.name, [])),
-			inv.owner,
-			", ".join(cost_center), ", ".join(warehouse), company_currency
-		]
-		# map income values
-		base_net_total = 0
-		for income_acc in income_accounts:
-			income_amount = flt(invoice_income_map.get(inv.name, {}).get(income_acc))
-			base_net_total += income_amount
-			row.append(income_amount)
-
-		# net total
-		row.append(base_net_total or inv.base_net_total)
-		# tax account
-		total_tax = 0
-		for tax_acc in tax_accounts:
-			if tax_acc not in income_accounts:
-				tax_amount = flt(invoice_tax_map.get(inv.name, {}).get(tax_acc))
-				total_tax += tax_amount
-				row.append(tax_amount)
-
-		# total tax, grand total, outstanding amount & rounded total
-		row += [total_tax, inv.base_grand_total,inv.paid_amount, inv.outstanding_amount]
-
-		data.append(row)
-
-	return columns, data
-
-def get_columns(invoice_list, additional_table_columns):
-	"""return columns based on filters"""
-	columns = [
-		_("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80",
-		_("Customer") + ":Link/Customer:120", _("Customer Name") + "::120"
-	]
-
-	if additional_table_columns:
-		columns += additional_table_columns
-
-	columns +=[
-		 _("Mode of Payment") + "::120",
-		 _("Owner") + "::150",
-		_("Cost Center") + ":Link/Cost Center:100", _("Warehouse") + ":Link/Warehouse:100",
-		{
-			"fieldname": "currency",
-			"label": _("Currency"),
-			"fieldtype": "Data",
-			"width": 80
-		}
-	]
-
-	income_accounts = tax_accounts = income_columns = tax_columns = []
-
-	if invoice_list:
-		income_accounts = frappe.db.sql_list("""select distinct income_account
-			from `tabSales Invoice Item` where docstatus = 1 and parent in (%s)
-			order by income_account""" %
-			', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]))
-
-		tax_accounts = 	frappe.db.sql_list("""select distinct account_head
-			from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice'
-			and docstatus = 1 and base_tax_amount_after_discount_amount != 0
-			and parent in (%s) order by account_head""" %
-			', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]))
-
-	income_columns = [(account + ":Currency/currency:120") for account in income_accounts]
-	for account in tax_accounts:
-		if account not in income_accounts:
-			tax_columns.append(account + ":Currency/currency:120")
-
-	columns = columns + income_columns + [_("Net Total") + ":Currency/currency:120"] + tax_columns + \
-		[_("Total Tax") + ":Currency/currency:120", _("Grand Total") + ":Currency/currency:120",
-		_("Paid Amount") + ":Currency/currency:120",
-		_("Outstanding Amount") + ":Currency/currency:120"]
-
-	return columns, income_accounts, tax_accounts
-
-def get_conditions(filters):
-	conditions = ""
-
-	if filters.get("company"): conditions += " and company=%(company)s"
-	if filters.get("customer"): conditions += " and customer = %(customer)s"
-	if filters.get("owner"): conditions += " and owner = %(owner)s"
-
-	if filters.get("from_date"): conditions += " and posting_date >= %(from_date)s"
-	if filters.get("to_date"): conditions += " and posting_date <= %(to_date)s"
-
-	if filters.get("mode_of_payment"):
-		conditions += """ and exists(select name from `tabSales Invoice Payment`
-			 where parent=`tabSales Invoice`.name
-			 	and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)"""
-
-	if filters.get("cost_center"):
-		conditions += """ and exists(select name from `tabSales Invoice Item`
-			 where parent=`tabSales Invoice`.name
-			 	and ifnull(`tabSales Invoice Item`.cost_center, '') = %(cost_center)s)"""
-
-	if filters.get("warehouse"):
-		conditions += """ and exists(select name from `tabSales Invoice Item`
-			 where parent=`tabSales Invoice`.name
-			 	and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s)"""
-
-	if filters.get("is_pos"): conditions += " and is_pos = %(is_pos)s"
-
-	return conditions
-
-def get_invoices(filters, additional_query_columns):
-	if additional_query_columns:
-		additional_query_columns = ', ' + ', '.join(additional_query_columns)
-
-	conditions = get_conditions(filters)
-	return frappe.db.sql("""select name, posting_date, customer, customer_name, owner,
-		base_net_total, base_grand_total, paid_amount, outstanding_amount {0}
-		from `tabSales Invoice`
-		where docstatus = 1 %s order by posting_date desc, name desc""".format(additional_query_columns or '') %
-		conditions, filters, as_dict=1)
-
-def get_invoice_income_map(invoice_list):
-	income_details = frappe.db.sql("""select parent, income_account, sum(base_net_amount) as amount
-		from `tabSales Invoice Item` where parent in (%s) group by parent, income_account""" %
-		', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
-
-	invoice_income_map = {}
-	for d in income_details:
-		invoice_income_map.setdefault(d.parent, frappe._dict()).setdefault(d.income_account, [])
-		invoice_income_map[d.parent][d.income_account] = flt(d.amount)
-
-	return invoice_income_map
-
-def get_invoice_tax_map(invoice_list, invoice_income_map, income_accounts):
-	tax_details = frappe.db.sql("""select parent, account_head,
-		sum(base_tax_amount_after_discount_amount) as tax_amount
-		from `tabSales Taxes and Charges` where parent in (%s) group by parent, account_head""" %
-		', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1)
-
-	invoice_tax_map = {}
-	for d in tax_details:
-		if d.account_head in income_accounts:
-			if invoice_income_map[d.parent].has_key(d.account_head):
-				invoice_income_map[d.parent][d.account_head] += flt(d.tax_amount)
-			else:
-				invoice_income_map[d.parent][d.account_head] = flt(d.tax_amount)
-		else:
-			invoice_tax_map.setdefault(d.parent, frappe._dict()).setdefault(d.account_head, [])
-			invoice_tax_map[d.parent][d.account_head] = flt(d.tax_amount)
-
-	return invoice_income_map, invoice_tax_map
-
-def get_invoice_cc_wh_map(invoice_list):
-
-	si_items = frappe.db.sql("""select parent, cost_center, warehouse
-		from `tabSales Invoice Item` where parent in (%s)
-		and (ifnull(cost_center, '') != '' or ifnull(warehouse, '') != '')""" %
-		', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]),as_dict=1)
-
-	invoice_cc_wh_map = {}
-	for d in si_items:
-		if d.cost_center:
-			invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault(
-				"cost_center", []).append(d.cost_center)
-
-		if d.warehouse:
-			invoice_cc_wh_map.setdefault(d.parent, frappe._dict()).setdefault(
-				"warehouse", []).append(d.warehouse)
-
-	return invoice_cc_wh_map
-
-def get_customer_details(customers):
-	customer_map = {}
-	for cust in frappe.db.sql("""select name from `tabCustomer`
-		where name in (%s)""" % ", ".join(["%s"]*len(customers)), tuple(customers), as_dict=1):
-			customer_map.setdefault(cust.name, cust)
-
-	return customer_map
-
-
-def get_mode_of_payments(invoice_list):
-	mode_of_payments = {}
-	if invoice_list:
-		inv_mop = frappe.db.sql("""select parent, mode_of_payment
-			from `tabSales Invoice Payment` where parent in (%s) group by parent, mode_of_payment""" %
-			', '.join(['%s']*len(invoice_list)), tuple(invoice_list), as_dict=1)
-
-		for d in inv_mop:
-			mode_of_payments.setdefault(d.parent, []).append(d.mode_of_payment)
-
-	return mode_of_payments
