From 4f40b2dca58da59b7849fb91e47a7ee6fcf95223 Mon Sep 17 00:00:00 2001 From: Shreya Shah Date: Wed, 16 May 2018 11:22:59 +0530 Subject: [PATCH] [Fix] Sales Person Reports (#13987) * Fix Sales Person Reports - Show quantity and amounts based on the delivered quantities if the Sales Order has been closed and all quantities weren't considered for further transactions. * Fix codacy * Modify as per the review comment --- ..._person_target_variance_item_group_wise.py | 17 ++++++---- .../sales_person_wise_transaction_summary.py | 33 ++++++++++++++----- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py index e57636c8f0..e7bb5b410c 100644 --- a/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py +++ b/erpnext/selling/report/sales_person_target_variance_item_group_wise/sales_person_target_variance_item_group_wise.py @@ -91,17 +91,22 @@ def get_achieved_details(filters, sales_person, all_sales_persons, target_item_g start_date, end_date = get_fiscal_year(fiscal_year = filters["fiscal_year"])[1:] item_details = frappe.db.sql(""" - select - sum(soi.stock_qty * (st.allocated_percentage/100)) as qty, - sum(soi.base_net_amount * (st.allocated_percentage/100)) as amount, - st.sales_person, MONTHNAME(so.transaction_date) as month_name + SELECT st.sales_person, MONTHNAME(so.transaction_date) as month_name, + CASE + WHEN so.status = "Closed" THEN sum(soi.delivered_qty * soi.conversion_factor * (st.allocated_percentage/100)) + ELSE sum(soi.stock_qty * (st.allocated_percentage/100)) + END as qty, + CASE + WHEN so.status = "Closed" THEN sum(soi.delivered_qty * soi.conversion_factor * soi.base_net_rate * (st.allocated_percentage/100)) + ELSE soi.base_net_amount * (st.allocated_percentage/100)) + END as amount from `tabSales Order Item` soi, `tabSales Order` so, `tabSales Team` st where soi.parent=so.name and so.docstatus=1 and st.parent=so.name and so.transaction_date>=%s and so.transaction_date<=%s - and exists(select name from `tabSales Person` where lft >= %s and rgt <= %s and name=st.sales_person) - and exists(select name from `tabItem Group` where lft >= %s and rgt <= %s and name=soi.item_group) + and exists(SELECT name from `tabSales Person` where lft >= %s and rgt <= %s and name=st.sales_person) + and exists(SELECT name from `tabItem Group` where lft >= %s and rgt <= %s and name=soi.item_group) group by sales_person, month_name """, diff --git a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py index 025e740173..19b6774ce9 100644 --- a/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py +++ b/erpnext/selling/report/sales_person_wise_transaction_summary/sales_person_wise_transaction_summary.py @@ -15,11 +15,12 @@ def execute(filters=None): data = [] for d in entries: - data.append([ - d.name, d.customer, d.territory, d.posting_date, d.item_code, - item_details.get(d.item_code, {}).get("item_group"), item_details.get(d.item_code, {}).get("brand"), - d.stock_qty, d.base_net_amount, d.sales_person, d.allocated_percentage, d.contribution_amt - ]) + if d.stock_qty > 0: + data.append([ + d.name, d.customer, d.territory, d.posting_date, d.item_code, + item_details.get(d.item_code, {}).get("item_group"), item_details.get(d.item_code, {}).get("brand"), + d.stock_qty, d.base_net_amount, d.sales_person, d.allocated_percentage, d.contribution_amt + ]) if data: total_row = [""]*len(data[0]) @@ -40,18 +41,34 @@ def get_columns(filters): def get_entries(filters): date_field = filters["doc_type"] == "Sales Order" and "transaction_date" or "posting_date" + if filters["doc_type"] == "Sales Order": + qty_field = "delivered_qty" + else: + qty_field = "qty" conditions, values = get_conditions(filters, date_field) + entries = frappe.db.sql(""" select dt.name, dt.customer, dt.territory, dt.%s as posting_date, dt_item.item_code, - dt_item.stock_qty, dt_item.base_net_amount, st.sales_person, st.allocated_percentage, - dt_item.base_net_amount*st.allocated_percentage/100 as contribution_amt + st.sales_person, st.allocated_percentage, + CASE + WHEN dt.status = "Closed" THEN dt_item.%s * dt_item.conversion_factor + ELSE dt_item.stock_qty + END as stock_qty, + CASE + WHEN dt.status = "Closed" THEN (dt_item.base_net_rate * dt_item.%s * dt_item.conversion_factor) + ELSE dt_item.base_net_amount + END as base_net_amount, + CASE + WHEN dt.status = "Closed" THEN ((dt_item.base_net_rate * dt_item.%s * dt_item.conversion_factor) * st.allocated_percentage/100) + ELSE dt_item.base_net_amount * st.allocated_percentage/100 + END as contribution_amt from `tab%s` dt, `tab%s Item` dt_item, `tabSales Team` st where st.parent = dt.name and dt.name = dt_item.parent and st.parenttype = %s and dt.docstatus = 1 %s order by st.sales_person, dt.name desc - """ %(date_field, filters["doc_type"], filters["doc_type"], '%s', conditions), + """ %(date_field, qty_field, qty_field, qty_field, filters["doc_type"], filters["doc_type"], '%s', conditions), tuple([filters["doc_type"]] + values), as_dict=1) return entries