From db999e293b5be2aca0f59d412e86eff94aa95ba2 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 1 May 2019 14:06:06 +0530 Subject: [PATCH 1/2] fix: Rename Inactive Items report to Inactive Sales Item --- .../report/inactive_sales_items/__init__.py | 0 .../inactive_sales_items.js | 34 ++++ .../inactive_sales_items.json | 21 +++ .../inactive_sales_items.py | 147 ++++++++++++++++++ 4 files changed, 202 insertions(+) create mode 100644 erpnext/accounts/report/inactive_sales_items/__init__.py create mode 100644 erpnext/accounts/report/inactive_sales_items/inactive_sales_items.js create mode 100644 erpnext/accounts/report/inactive_sales_items/inactive_sales_items.json create mode 100644 erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py diff --git a/erpnext/accounts/report/inactive_sales_items/__init__.py b/erpnext/accounts/report/inactive_sales_items/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.js b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.js new file mode 100644 index 00000000000..36bd29efeb2 --- /dev/null +++ b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.js @@ -0,0 +1,34 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +/* eslint-disable */ + +frappe.query_reports["Inactive Sales Items"] = { + "filters": [ + { + fieldname: "item", + label: __("Item"), + fieldtype: "Link", + options: "Item" + }, + { + fieldname: "item_group", + label: __("Item Group"), + fieldtype: "Link", + options: "Item Group" + }, + { + fieldname: "based_on", + label: __("Based On"), + fieldtype: "Select", + options: "Sales Order\nSales Invoice", + default: "Sales Order" + }, + { + fieldname: "days", + label: __("Days Since Last order"), + fieldtype: "Select", + options: [30, 60, 90], + default: 30 + }, + ] +}; diff --git a/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.json b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.json new file mode 100644 index 00000000000..c97f824b626 --- /dev/null +++ b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.json @@ -0,0 +1,21 @@ +{ + "add_total_row": 0, + "creation": "2019-05-01 13:46:23.044979", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "letter_head": "Test Letter Head 1", + "modified": "2019-05-01 13:46:23.044979", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Inactive Sales Items", + "owner": "Administrator", + "prepared_report": 0, + "ref_doctype": "Sales Invoice", + "report_name": "Inactive Sales Items", + "report_type": "Script Report", + "roles": [] +} \ No newline at end of file diff --git a/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py new file mode 100644 index 00000000000..844942ff0f6 --- /dev/null +++ b/erpnext/accounts/report/inactive_sales_items/inactive_sales_items.py @@ -0,0 +1,147 @@ +# 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.utils import getdate, add_days, today, cint +from frappe import _ + +def execute(filters=None): + + columns = get_columns() + data = get_data(filters) + return columns, data + +def get_columns(): + + columns = [ + { + "fieldname": "territory", + "fieldtype": "Link", + "label": _("Territory"), + "options": "Territory", + "width": 100 + }, + { + "fieldname": "item_group", + "fieldtype": "Link", + "label": _("Item Group"), + "options": "Item Group", + "width": 150 + }, + { + "fieldname": "item_name", + "fieldtype": "Link", + "options": "Item", + "label": "Item", + "width": 150 + }, + { + "fieldname": "item_name", + "fieldtype": "Data", + "label": _("Item Name"), + "width": 150 + }, + + { + "fieldname": "customer", + "fieldtype": "Link", + "label": _("Customer"), + "options": "Customer", + "width": 100 + }, + { + "fieldname": "last_order_date", + "fieldtype": "Date", + "label": _("Last Order Date"), + "width": 100 + }, + { + "fieldname": "qty", + "fieldtype": "Float", + "label": _("Quantity"), + "width": 100 + }, + { + "fieldname": "days_since_last_order", + "fieldtype": "Int", + "label": _("Days Since Last Order"), + "width": 100 + }, + ] + + return columns + + +def get_data(filters): + + data = [] + items = get_items(filters) + sales_invoice_data = get_sales_details(filters) + + for item in items: + if sales_invoice_data.get(item.name): + item_obj = sales_invoice_data[item.name] + if item_obj.days_since_last_order > cint(filters['days']): + row = { + "territory": item_obj.territory, + "item_group": item_obj.item_group, + "item": item_obj.name, + "item_name": item_obj.item_name, + "customer": item_obj.customer, + "last_order_date": item_obj.last_order_date, + "qty": item_obj.qty, + "days_since_last_order": item_obj.days_since_last_order + } + data.append(row) + else: + row = { + "item_group": item.item_group, + "item": item.name, + "item_name": item.item_name + } + data.append(row) + + return data + + +def get_sales_details(filters): + + data = [] + item_details_map = {} + + date_field = "s.transaction_date" if filters["based_on"] == "Sales Order" else "s.posting_date" + + sales_data = frappe.db.sql(""" + select s.territory, s.customer, si.item_group, si.item_name, si.qty, {date_field} as last_order_date, + DATEDIFF(CURDATE(), {date_field}) as days_since_last_order + from `tab{doctype}` s, `tab{doctype} Item` si + where s.name = si.parent and s.docstatus = 1 + group by si.name order by days_since_last_order """ #nosec + .format(date_field = date_field, doctype = filters['based_on']), as_dict=1) + + for d in sales_data: + item_details_map.setdefault(d.item_name, d) + + return item_details_map + +def get_items(filters): + + filters_dict = { + "disabled": 0, + "is_stock_item": 1 + } + + if filters.get("item_group"): + filters_dict.update({ + "item_group": filters["item_group"] + }) + + if filters.get("item"): + filters_dict.update({ + "name": filters["item"] + }) + + items = frappe.get_all("Item", fields=["name", "item_group", "item_name"], filters=filters_dict, order_by="name") + + return items From 6dfbd2bb645e97d0d72dda9b1d543d85016221d3 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 1 May 2019 14:17:16 +0530 Subject: [PATCH 2/2] fix: Delete old report --- .../stock/report/inactive_items/__init__.py | 0 .../report/inactive_items/inactive_items.js | 34 ---- .../report/inactive_items/inactive_items.json | 31 ---- .../report/inactive_items/inactive_items.py | 148 ------------------ 4 files changed, 213 deletions(-) delete mode 100644 erpnext/stock/report/inactive_items/__init__.py delete mode 100644 erpnext/stock/report/inactive_items/inactive_items.js delete mode 100644 erpnext/stock/report/inactive_items/inactive_items.json delete mode 100644 erpnext/stock/report/inactive_items/inactive_items.py diff --git a/erpnext/stock/report/inactive_items/__init__.py b/erpnext/stock/report/inactive_items/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/erpnext/stock/report/inactive_items/inactive_items.js b/erpnext/stock/report/inactive_items/inactive_items.js deleted file mode 100644 index 39dfd5c8c36..00000000000 --- a/erpnext/stock/report/inactive_items/inactive_items.js +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt -/* eslint-disable */ - -frappe.query_reports["Inactive Items"] = { - "filters": [ - { - fieldname: "item", - label: __("Item"), - fieldtype: "Link", - options: "Item" - }, - { - fieldname: "item_group", - label: __("Item Group"), - fieldtype: "Link", - options: "Item Group" - }, - { - fieldname: "based_on", - label: __("Based On"), - fieldtype: "Select", - options: "Sales Order\nSales Invoice", - default: "Sales Order" - }, - { - fieldname: "days", - label: __("Days Since Last order"), - fieldtype: "Select", - options: [30, 60, 90], - default: 30 - }, - ] -} diff --git a/erpnext/stock/report/inactive_items/inactive_items.json b/erpnext/stock/report/inactive_items/inactive_items.json deleted file mode 100644 index b9eb05ec050..00000000000 --- a/erpnext/stock/report/inactive_items/inactive_items.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "add_total_row": 0, - "creation": "2019-04-16 16:05:00.647308", - "disable_prepared_report": 0, - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "idx": 0, - "is_standard": "Yes", - "letter_head": "Test Letter Head 1", - "modified": "2019-04-16 16:06:33.630043", - "modified_by": "Administrator", - "module": "Stock", - "name": "Inactive Items", - "owner": "Administrator", - "prepared_report": 0, - "ref_doctype": "Sales Invoice", - "report_name": "Inactive Items", - "report_type": "Script Report", - "roles": [ - { - "role": "Accounts User" - }, - { - "role": "Accounts Manager" - }, - { - "role": "Auditor" - } - ] -} \ No newline at end of file diff --git a/erpnext/stock/report/inactive_items/inactive_items.py b/erpnext/stock/report/inactive_items/inactive_items.py deleted file mode 100644 index 8d879126da6..00000000000 --- a/erpnext/stock/report/inactive_items/inactive_items.py +++ /dev/null @@ -1,148 +0,0 @@ -# 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.utils import getdate, add_days, today, cint -from frappe import _ - -def execute(filters=None): - - columns = get_columns() - data = get_data(filters) - return columns, data - -def get_columns(): - - columns = [ - { - "fieldname": "territory", - "fieldtype": "Link", - "label": _("Territory"), - "options": "Territory", - "width": 100 - }, - { - "fieldname": "item_group", - "fieldtype": "Link", - "label": _("Item Group"), - "options": "Item Group", - "width": 150 - }, - { - "fieldname": "item_name", - "fieldtype": "Link", - "options": "Item", - "label": "Item", - "width": 150 - }, - { - "fieldname": "item_name", - "fieldtype": "Data", - "label": _("Item Name"), - "width": 150 - }, - - { - "fieldname": "customer", - "fieldtype": "Link", - "label": _("Customer"), - "options": "Customer", - "width": 100 - }, - { - "fieldname": "last_order_date", - "fieldtype": "Date", - "label": _("Last Order Date"), - "width": 100 - }, - { - "fieldname": "qty", - "fieldtype": "Float", - "label": _("Quantity"), - "width": 100 - }, - { - "fieldname": "days_since_last_order", - "fieldtype": "Int", - "label": _("Days Since Last Order"), - "width": 100 - }, - ] - - return columns - - -def get_data(filters): - - data = [] - items = get_items(filters) - sales_invoice_data = get_sales_details(filters) - - for item in items: - if sales_invoice_data.get(item.name): - item_obj = sales_invoice_data[item.name] - if item_obj.days_since_last_order > cint(filters['days']): - row = { - "territory": item_obj.territory, - "item_group": item_obj.item_group, - "item": item_obj.name, - "item_name": item_obj.item_name, - "customer": item_obj.customer, - "last_order_date": item_obj.last_order_date, - "qty": item_obj.qty, - "days_since_last_order": item_obj.days_since_last_order - } - data.append(row) - else: - row = { - "item_group": item.item_group, - "item": item.name, - "item_name": item.item_name - } - data.append(row) - - return data - - -def get_sales_details(filters): - - data = [] - item_details_map = {} - - date_field = "s.transaction_date" if filters["based_on"] == "Sales Order" else "s.posting_date" - - sales_data = frappe.db.sql(""" - select s.territory, s.customer, si.item_group, si.item_name, si.qty, {date_field} as last_order_date, - DATEDIFF(CURDATE(), {date_field}) as days_since_last_order - from `tab{doctype}` s, `tab{doctype} Item` si - where s.name = si.parent and s.docstatus = 1 - group by si.name order by days_since_last_order """ #nosec - .format(date_field = date_field, doctype = filters['based_on']), as_dict=1) - - for d in sales_data: - item_details_map.setdefault(d.item_name, d) - - return item_details_map - -def get_items(filters): - - filters_dict = { - "disabled": 0, - "is_stock_item": 1 - } - - if filters.get("item_group"): - filters_dict.update({ - "item_group": filters["item_group"] - }) - - if filters.get("item"): - filters_dict.update({ - "name": filters["item"] - }) - - items = frappe.get_all("Item", fields=["name", "item_group", "item_name"], filters=filters_dict, order_by="name") - - return items -