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