feat(customer): Add report to show item prices per Customer
This commit is contained in:
		
							parent
							
								
									0d7d4879a9
								
							
						
					
					
						commit
						e3a3306b30
					
				| @ -0,0 +1,27 @@ | |||||||
|  | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
 | ||||||
|  | // For license information, please see license.txt
 | ||||||
|  | /* eslint-disable */ | ||||||
|  | 
 | ||||||
|  | frappe.query_reports["Customer-wise Item Price"] = { | ||||||
|  | 	"filters": [ | ||||||
|  | 		{ | ||||||
|  | 			"label": __("Customer"), | ||||||
|  | 			"fieldname": "customer", | ||||||
|  | 			"fieldtype": "Link", | ||||||
|  | 			"options": "Customer", | ||||||
|  | 			"reqd": 1 | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"label": __("Item"), | ||||||
|  | 			"fieldname": "item", | ||||||
|  | 			"fieldtype": "Link", | ||||||
|  | 			"options": "Item", | ||||||
|  | 			"get_query": () => { | ||||||
|  | 				return { | ||||||
|  | 					query: "erpnext.controllers.queries.item_query", | ||||||
|  | 					filters: { 'is_sales_item': 1 } | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	] | ||||||
|  | } | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | { | ||||||
|  |  "add_total_row": 0,  | ||||||
|  |  "creation": "2019-06-12 03:25:36.263179",  | ||||||
|  |  "disable_prepared_report": 0,  | ||||||
|  |  "disabled": 0,  | ||||||
|  |  "docstatus": 0,  | ||||||
|  |  "doctype": "Report",  | ||||||
|  |  "idx": 0,  | ||||||
|  |  "is_standard": "Yes",  | ||||||
|  |  "letter_head": "Delta9",  | ||||||
|  |  "modified": "2019-06-12 03:25:36.263179",  | ||||||
|  |  "modified_by": "Administrator",  | ||||||
|  |  "module": "Selling",  | ||||||
|  |  "name": "Customer-wise Item Price",  | ||||||
|  |  "owner": "Administrator",  | ||||||
|  |  "prepared_report": 0,  | ||||||
|  |  "ref_doctype": "Customer",  | ||||||
|  |  "report_name": "Customer-wise Item Price",  | ||||||
|  |  "report_type": "Script Report",  | ||||||
|  |  "roles": [ | ||||||
|  |   { | ||||||
|  |    "role": "Sales User" | ||||||
|  |   },  | ||||||
|  |   { | ||||||
|  |    "role": "Stock Manager" | ||||||
|  |   },  | ||||||
|  |   { | ||||||
|  |    "role": "Accounts User" | ||||||
|  |   },  | ||||||
|  |   { | ||||||
|  |    "role": "Accounts Manager" | ||||||
|  |   },  | ||||||
|  |   { | ||||||
|  |    "role": "Sales Manager" | ||||||
|  |   },  | ||||||
|  |   { | ||||||
|  |    "role": "Sales Master Manager" | ||||||
|  |   },  | ||||||
|  |   { | ||||||
|  |    "role": "Stock User" | ||||||
|  |   } | ||||||
|  |  ] | ||||||
|  | } | ||||||
| @ -0,0 +1,101 @@ | |||||||
|  | # Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors | ||||||
|  | # For license information, please see license.txt | ||||||
|  | 
 | ||||||
|  | from __future__ import unicode_literals | ||||||
|  | 
 | ||||||
|  | import frappe | ||||||
|  | from erpnext import get_default_company | ||||||
|  | from erpnext.accounts.party import get_party_details | ||||||
|  | from erpnext.stock.get_item_details import get_price_list_rate_for | ||||||
|  | from frappe import _ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def execute(filters=None): | ||||||
|  | 	if not filters: | ||||||
|  | 		filters = {} | ||||||
|  | 
 | ||||||
|  | 	if not filters.get("customer"): | ||||||
|  | 		frappe.throw(_("Please select a Customer")) | ||||||
|  | 
 | ||||||
|  | 	columns = get_columns(filters) | ||||||
|  | 	data = get_data(filters) | ||||||
|  | 
 | ||||||
|  | 	return columns, data | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_columns(filters=None): | ||||||
|  | 	return [ | ||||||
|  | 		{ | ||||||
|  | 			"label": _("Item Code"), | ||||||
|  | 			"fieldname": "item_code", | ||||||
|  | 			"fieldtype": "Link", | ||||||
|  | 			"options": "Item", | ||||||
|  | 			"width": 150 | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"label": _("Item Name"), | ||||||
|  | 			"fieldname": "item_name", | ||||||
|  | 			"fieldtype": "Data", | ||||||
|  | 			"width": 200 | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"label": _("Selling Rate"), | ||||||
|  | 			"fieldname": "selling_rate", | ||||||
|  | 			"fieldtype": "Currency" | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"label": _("Available Stock"), | ||||||
|  | 			"fieldname": "available_stock", | ||||||
|  | 			"fieldtype": "Float", | ||||||
|  | 			"width": 150 | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			"label": _("Price List"), | ||||||
|  | 			"fieldname": "price_list", | ||||||
|  | 			"fieldtype": "Link", | ||||||
|  | 			"options": "Price List", | ||||||
|  | 			"width": 120 | ||||||
|  | 		} | ||||||
|  | 	] | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_data(filters=None): | ||||||
|  | 	data = [] | ||||||
|  | 	customer_details = get_customer_details(filters) | ||||||
|  | 	items = get_selling_items(filters) | ||||||
|  | 
 | ||||||
|  | 	for item in items: | ||||||
|  | 		price_list_rate = get_price_list_rate_for(customer_details, item.item_code) or 0.0 | ||||||
|  | 		available_stock = frappe.db.sql("SELECT sum(actual_qty) FROM `tabBin` WHERE item_code = %s", item.item_code) | ||||||
|  | 		available_stock = available_stock[0][0] if available_stock else None | ||||||
|  | 
 | ||||||
|  | 		data.append({ | ||||||
|  | 			"item_code": item.item_code, | ||||||
|  | 			"item_name": item.item_name, | ||||||
|  | 			"selling_rate": price_list_rate, | ||||||
|  | 			"price_list": customer_details.get("price_list"), | ||||||
|  | 			"available_stock": available_stock, | ||||||
|  | 		}) | ||||||
|  | 
 | ||||||
|  | 	return data | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_customer_details(filters): | ||||||
|  | 	customer_details = get_party_details(party=filters.get("customer"), party_type="Customer") | ||||||
|  | 	customer_details.update({ | ||||||
|  | 		"company": get_default_company(), | ||||||
|  | 		"price_list": customer_details.get("selling_price_list") | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	return customer_details | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def get_selling_items(filters): | ||||||
|  | 	if filters.get("item"): | ||||||
|  | 		item_filters = {"item_code": filters.get("item"), "is_sales_item": 1, "disabled": 0} | ||||||
|  | 	else: | ||||||
|  | 		item_filters = {"is_sales_item": 1, "disabled": 0} | ||||||
|  | 
 | ||||||
|  | 	items = frappe.get_all("Item", filters=item_filters, fields=["item_code", "item_name"], order_by="item_name") | ||||||
|  | 
 | ||||||
|  | 	return items | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user