From 66f10cd14fce583b608c0d2b9e9ace9f7d680a67 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 7 Jun 2013 18:05:16 +0530 Subject: [PATCH 01/10] Quotation Trend --- selling/page/selling_home/selling_home.js | 5 + selling/report/quotation_trends/__init__.py | 0 .../quotation_trends/quotation_trends.js | 40 ++++++++ .../quotation_trends/quotation_trends.py | 96 +++++++++++++++++++ .../quotation_trends/quotation_trends.txt | 22 +++++ 5 files changed, 163 insertions(+) create mode 100644 selling/report/quotation_trends/__init__.py create mode 100644 selling/report/quotation_trends/quotation_trends.js create mode 100644 selling/report/quotation_trends/quotation_trends.py create mode 100644 selling/report/quotation_trends/quotation_trends.txt diff --git a/selling/page/selling_home/selling_home.js b/selling/page/selling_home/selling_home.js index 9c18fda6818..15f9b861620 100644 --- a/selling/page/selling_home/selling_home.js +++ b/selling/page/selling_home/selling_home.js @@ -170,6 +170,11 @@ wn.module_page["Selling"] = [ route: "query-report/Customers Not Buying Since Long Time", doctype: "Sales Order" }, + { + "label":wn._("Quotation Trend"), + route: "query-report/Quotation Trends", + doctype: "Sales Order" + }, ] } diff --git a/selling/report/quotation_trends/__init__.py b/selling/report/quotation_trends/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/selling/report/quotation_trends/quotation_trends.js b/selling/report/quotation_trends/quotation_trends.js new file mode 100644 index 00000000000..e55e252c0b6 --- /dev/null +++ b/selling/report/quotation_trends/quotation_trends.js @@ -0,0 +1,40 @@ +wn.query_reports["Quotation Trends"] = { + "filters": [ + { + "fieldname":"period", + "label": "Period", + "fieldtype": "Select", + "options": "Monthly"+NEWLINE+"Quarterly"+NEWLINE+"Half-yearly"+NEWLINE+"Yearly", + "default": "Monthly" + }, + { + "fieldname":"based_on", + "label": "Based On", + "fieldtype": "Select", + "options": "Item"+NEWLINE+"Item Group"+NEWLINE+"Customer"+NEWLINE+"Customer Group"+NEWLINE+"Territory"+NEWLINE+"Project", + "default": "Item" + }, + { + "fieldname":"group_by", + "label": "Group By", + "fieldtype": "Select", + "options": "Item"+NEWLINE+"Customer", + "default": "Customer" + }, + { + "fieldname":"fiscal_year", + "label": "Fiscal Year", + "fieldtype": "Link", + "options":'Fiscal Year', + "default": "Fiscal Year" + }, + { + "fieldname":"company", + "label": "Company", + "fieldtype": "Link", + "options": "Company", + "default": "Company" + }, + + ] +} \ No newline at end of file diff --git a/selling/report/quotation_trends/quotation_trends.py b/selling/report/quotation_trends/quotation_trends.py new file mode 100644 index 00000000000..5b9fc04fb39 --- /dev/null +++ b/selling/report/quotation_trends/quotation_trends.py @@ -0,0 +1,96 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import getdate, cint + +def execute(filters=None): + if not filters: filters ={} + + period = filters.get("period") + based_on = filters.get("based_on") + group_by = filters.get("group_by") + + columns = get_columns(filters, period, based_on, group_by) + data = [] + + return columns, data + +def get_columns(filters, period, based_on, group_by): + columns = [] + pwc = [] + bon = [] + gby = [] + + if not (period and based_on): + webnotes.msgprint("Value missing in 'Period' or 'Based On'",raise_exception=1) + elif based_on == group_by: + webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'") + else: + pwc = period_wise_column(filters, period, pwc) + bon = base_wise_column(based_on, bon) + gby = gruoup_wise_column(group_by) + + if gby: + columns = bon + gby + pwc + else: + columns = bon + pwc + return columns + + +def period_wise_column(filters, period, pwc): + + if period == "Monthly": + month_name = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] + for month in range(0,len(month_name)): + pwc.append(month_name[month]+' (Qty):Float:120') + pwc.append(month_name[month]+' (Amt):Currency:120') + + elif period == "Quarterly": + pwc = ["Q1(qty):Float:120", "Q1(amt):Currency:120", "Q2(qty):Float:120", "Q2(amt):Currency:120", + "Q3(qty):Float:120", "Q3(amt):Currency:120", "Q4(qty):Float:120", "Q4(amt):Currency:120" + ] + + elif period == "Half-yearly": + pwc = ["Fisrt Half(qty):Float:120", "Fisrt Half(amt):Currency:120", "Second Half(qty):Float:120", + "Second Half(amt):Currency:120" + ] + else: + pwc = [filters.get("fiscal_year")+"(qty):Float:120", filters.get("fiscal_year")+"(amt):Currency:120"] + + return pwc + +def base_wise_column(based_on, bon): + if based_on == "Item": + bon = ["Item:Link/Item:120", "Item Name:Data:120"] + elif based_on == "Item Group": + bon = ["Item Group:Link/Item Group:120"] + elif based_on == "Customer": + bon = ["Customer:Link/Customer:120", "Territory:Link/Territory:120"] + elif based_on == "Customer Group": + bon = ["Customer Group:Link/Customer Group"] + elif based_on == "Territory": + bon = ["Territory:Link/Territory:120"] + else: + bon = ["Project:Link/Project:120"] + return bon + +def gruoup_wise_column(group_by): + if group_by: + return [group_by+":Link/"+group_by+":120"] + else: + return [] \ No newline at end of file diff --git a/selling/report/quotation_trends/quotation_trends.txt b/selling/report/quotation_trends/quotation_trends.txt new file mode 100644 index 00000000000..a135c345607 --- /dev/null +++ b/selling/report/quotation_trends/quotation_trends.txt @@ -0,0 +1,22 @@ +[ + { + "creation": "2013-06-07 16:01:16", + "docstatus": 0, + "modified": "2013-06-07 16:01:16", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "add_total_row": 1, + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "ref_doctype": "Quotation", + "report_name": "Quotation Trends", + "report_type": "Script Report" + }, + { + "doctype": "Report", + "name": "Quotation Trends" + } +] \ No newline at end of file From bcbd9a48008e80326d584260a23037fc305341c3 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Tue, 11 Jun 2013 18:06:58 +0530 Subject: [PATCH 02/10] [Report][Quotation Trend] --- .../trend_analyzer/trend_analyzer.py | 6 +- .../quotation_trends/quotation_trends.js | 6 +- .../quotation_trends/quotation_trends.py | 134 ++++++++++++++---- 3 files changed, 110 insertions(+), 36 deletions(-) diff --git a/accounts/search_criteria/trend_analyzer/trend_analyzer.py b/accounts/search_criteria/trend_analyzer/trend_analyzer.py index 87e1e8ed096..9bdde392b4e 100644 --- a/accounts/search_criteria/trend_analyzer/trend_analyzer.py +++ b/accounts/search_criteria/trend_analyzer/trend_analyzer.py @@ -155,10 +155,8 @@ for r in res: for d in range(len(colnames) - cr): r.append(flt(main_det[0][d])) out.append(r) - if group_by: flag = 1 - # check for root nodes if based_on in ['Item Group','Customer Group','Territory']: is_grp = sql("select is_group from `tab%s` where name = '%s'" % (based_on, cstr(r[col_idx[based_on]]).strip())) is_grp = is_grp and cstr(is_grp[0][0]) or '' @@ -167,11 +165,11 @@ for r in res: if flag == 1: det = [x[0] for x in sql("SELECT DISTINCT %s FROM %s where %s" % (sel_col, add_tab, add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))] - for des in range(len(det)): t_row = ['' for i in range(len(colnames))] t_row[col_idx[group_by]] = cstr(det[des]) gr_det = sql("SELECT %s FROM %s WHERE %s = '%s' and %s" % (query_val, add_tab, sel_col, cstr(det[des]), add_cond % {'value':cstr(r[col_idx[based_on]]).strip()})) + webnotes.errprint(cstr(r[col_idx[based_on]]).strip()) for d in range(len(col_names)): t_row[col_idx[col_names[d]]] = flt(gr_det[0][d]) - out.append(t_row) + out.append(t_row) \ No newline at end of file diff --git a/selling/report/quotation_trends/quotation_trends.js b/selling/report/quotation_trends/quotation_trends.js index e55e252c0b6..e166fa66cec 100644 --- a/selling/report/quotation_trends/quotation_trends.js +++ b/selling/report/quotation_trends/quotation_trends.js @@ -19,21 +19,21 @@ wn.query_reports["Quotation Trends"] = { "label": "Group By", "fieldtype": "Select", "options": "Item"+NEWLINE+"Customer", - "default": "Customer" + "default": "" }, { "fieldname":"fiscal_year", "label": "Fiscal Year", "fieldtype": "Link", "options":'Fiscal Year', - "default": "Fiscal Year" + "default": sys_defaults.fiscal_year }, { "fieldname":"company", "label": "Company", "fieldtype": "Link", "options": "Company", - "default": "Company" + "default": sys_defaults.company }, ] diff --git a/selling/report/quotation_trends/quotation_trends.py b/selling/report/quotation_trends/quotation_trends.py index 5b9fc04fb39..6a81d97f16a 100644 --- a/selling/report/quotation_trends/quotation_trends.py +++ b/selling/report/quotation_trends/quotation_trends.py @@ -16,78 +16,154 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import getdate, cint +from webnotes.utils import cint, add_days, add_months, cstr def execute(filters=None): if not filters: filters ={} - - period = filters.get("period") - based_on = filters.get("based_on") - group_by = filters.get("group_by") - columns = get_columns(filters, period, based_on, group_by) - data = [] + # Global data + ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + + columns, query_bon, query_pwc, group_by = get_columns(filters, year_start_date, start_month) + + ptab = "tabQuotation" + ctab = "tabQuotation Item" + data = get_data(filters, ptab, ctab, query_bon, query_pwc, group_by) return columns, data -def get_columns(filters, period, based_on, group_by): - columns = [] - pwc = [] - bon = [] - gby = [] +def get_columns(filters, year_start_date, start_month): + columns, pwc, bon, gby = [], [], [], [] + query_bon, query_pwc = '', '' + + period = filters.get("period") + based_on = filters.get("based_on") + grby = filters.get("group_by") if not (period and based_on): - webnotes.msgprint("Value missing in 'Period' or 'Based On'",raise_exception=1) - elif based_on == group_by: - webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'") + webnotes.msgprint("Value missing in 'Period' or 'Based On'", raise_exception=1) + elif based_on == grby: + webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'", raise_exception=1) else: - pwc = period_wise_column(filters, period, pwc) - bon = base_wise_column(based_on, bon) - gby = gruoup_wise_column(group_by) + bon,query_bon,group_by = base_wise_column(based_on, bon) + pwc,query_pwc = period_wise_column_and_query(filters, period, pwc, year_start_date,start_month) + gby = gruoup_wise_column(grby) if gby: - columns = bon + gby + pwc + columns = bon + gby + pwc +["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] else: - columns = bon + pwc - return columns + columns = bon + pwc + ["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] + return columns, query_bon, query_pwc, group_by -def period_wise_column(filters, period, pwc): +def get_data(filters, ptab, ctab, query_bon, query_pwc, group_by): + query_details = query_bon + query_pwc + 'SUM(t2.qty), SUM(t1.grand_total) ' + query_pwc = query_pwc + 'SUM(t2.qty), SUM(t1.grand_total)' + if not filters.get("group_by"): + data = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' and t1.docstatus = 1 + group by %s + """%(query_details, ptab, ctab, filters.get("company"), filters.get("fiscal_year"), group_by), as_list=1) + + # No coma is included between %s and t2.item_code cause it's already bounded with query_bon + if filters.get("group_by") == 'Item': + data = webnotes.conn.sql(""" select %s t2.item_code, %s from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' and t1.docstatus = 1 + group by %s, %s"""%( query_bon, query_pwc, ptab, ctab, filters.get("company"), filters.get("fiscal_year"), + group_by,'t2.item_code'), as_list=1) + + if filters.get("group_by") == 'Customer': + data = webnotes.conn.sql(""" select %s t1.customer_name, %s from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' and t1.docstatus = 1 + group by %s, %s"""%(query_bon, query_pwc, ptab, ctab, filters.get("company"), filters.get("fiscal_year"), group_by, 't1.customer_name'), as_list=1) + + return data + +def period_wise_column_and_query(filters, period, pwc, year_start_date, start_month): + query_details = '' if period == "Monthly": month_name = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] - for month in range(0,len(month_name)): + for month in range(start_month-1,len(month_name)): pwc.append(month_name[month]+' (Qty):Float:120') pwc.append(month_name[month]+' (Amt):Currency:120') + query_details += """Sum(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t2.qty ELSE NULL END), + SUM(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + """%{"mon_num": cstr(month+1)} + for month in range(0, start_month-1): + pwc.append(month_name[month]+' (Qty):Float:120') + pwc.append(month_name[month]+' (Amt):Currency:120') + query_details += """Sum(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t2.qty ELSE NULL END), + SUM(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + """%{"mon_num": cstr(month+1)} + elif period == "Quarterly": pwc = ["Q1(qty):Float:120", "Q1(amt):Currency:120", "Q2(qty):Float:120", "Q2(amt):Currency:120", - "Q3(qty):Float:120", "Q3(amt):Currency:120", "Q4(qty):Float:120", "Q4(amt):Currency:120" - ] + "Q3(qty):Float:120", "Q3(amt):Currency:120", "Q4(qty):Float:120", "Q4(amt):Currency:120"] + + first_qsd, second_qsd, third_qsd, fourth_qsd = year_start_date, add_months(year_start_date,3), add_months(year_start_date,6), add_months(year_start_date,9) + first_qed, second_qed, third_qed, fourth_qed = add_days(add_months(first_qsd,3),-1), add_days(add_months(second_qsd,3),-1), add_days(add_months(third_qsd,3),-1), add_days(add_months(fourth_qsd,3),-1) + + bet_dates = [[first_qsd,first_qed],[second_qsd,second_qed],[third_qsd,third_qed],[fourth_qsd,fourth_qed]] + for d in bet_dates: + query_details += """ + SUM(CASE WHEN t1.transaction_date BETWEEN '%(sd)s' AND '%(ed)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.transaction_date BETWEEN '%(sd)s' AND '%(ed)s' THEN t1.grand_total ELSE NULL END), + """%{"sd": d[0],"ed": d[1]} elif period == "Half-yearly": pwc = ["Fisrt Half(qty):Float:120", "Fisrt Half(amt):Currency:120", "Second Half(qty):Float:120", - "Second Half(amt):Currency:120" - ] + "Second Half(amt):Currency:120"] + + first_half_start = year_start_date + first_half_end = add_days(add_months(first_half_start,6),-1) + second_half_start = add_days(first_half_end,1) + second_half_end = add_days(add_months(second_half_start,6),-1) + + query_details = """ SUM(CASE WHEN t1.transaction_date BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.transaction_date BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t1.grand_total ELSE NULL END), + SUM(CASE WHEN t1.transaction_date BETWEEN '%(shs)s' AND '%(she)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.transaction_date BETWEEN '%(shs)s' AND '%(she)s' THEN t1.grand_total ELSE NULL END), + """%{"fhs": first_half_start, "fhe": first_half_end,"shs": second_half_start, "she": second_half_end} + else: pwc = [filters.get("fiscal_year")+"(qty):Float:120", filters.get("fiscal_year")+"(amt):Currency:120"] + query_details = " SUM(t2.qty), SUM(t1.grand_total)," - return pwc + return pwc, query_details def base_wise_column(based_on, bon): if based_on == "Item": bon = ["Item:Link/Item:120", "Item Name:Data:120"] + query_details = "t2.item_code, t2.item_name," + group_by = 't2.item_code' + elif based_on == "Item Group": bon = ["Item Group:Link/Item Group:120"] + query_details = "t2.item_group," + group_by = 't2.item_group' + elif based_on == "Customer": bon = ["Customer:Link/Customer:120", "Territory:Link/Territory:120"] + query_details = "t1.customer_name, t1.territory, " + group_by = 't1.customer_name' + elif based_on == "Customer Group": bon = ["Customer Group:Link/Customer Group"] + query_details = "t1.customer_group, " + group_by = 't1.customer_group' + elif based_on == "Territory": bon = ["Territory:Link/Territory:120"] + query_details = "t1.territory, " + group_by = 't1.territory' + else: bon = ["Project:Link/Project:120"] - return bon + return bon, query_details, group_by def gruoup_wise_column(group_by): if group_by: From f9966f44cdb553dff236cba71b04336e16a34796 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 12 Jun 2013 17:55:19 +0530 Subject: [PATCH 03/10] [Report][Quotation Trend Complete] --- .../trend_analyzer/trend_analyzer.py | 4 +- .../quotation_trends/quotation_trends.py | 128 ++++++++++++------ .../quotation_trends/quotation_trends.txt | 4 +- 3 files changed, 93 insertions(+), 43 deletions(-) diff --git a/accounts/search_criteria/trend_analyzer/trend_analyzer.py b/accounts/search_criteria/trend_analyzer/trend_analyzer.py index 9bdde392b4e..6bc4cf6f694 100644 --- a/accounts/search_criteria/trend_analyzer/trend_analyzer.py +++ b/accounts/search_criteria/trend_analyzer/trend_analyzer.py @@ -155,8 +155,10 @@ for r in res: for d in range(len(colnames) - cr): r.append(flt(main_det[0][d])) out.append(r) + if group_by: flag = 1 + # check for root nodes if based_on in ['Item Group','Customer Group','Territory']: is_grp = sql("select is_group from `tab%s` where name = '%s'" % (based_on, cstr(r[col_idx[based_on]]).strip())) is_grp = is_grp and cstr(is_grp[0][0]) or '' @@ -165,11 +167,11 @@ for r in res: if flag == 1: det = [x[0] for x in sql("SELECT DISTINCT %s FROM %s where %s" % (sel_col, add_tab, add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))] + for des in range(len(det)): t_row = ['' for i in range(len(colnames))] t_row[col_idx[group_by]] = cstr(det[des]) gr_det = sql("SELECT %s FROM %s WHERE %s = '%s' and %s" % (query_val, add_tab, sel_col, cstr(det[des]), add_cond % {'value':cstr(r[col_idx[based_on]]).strip()})) - webnotes.errprint(cstr(r[col_idx[based_on]]).strip()) for d in range(len(col_names)): t_row[col_idx[col_names[d]]] = flt(gr_det[0][d]) out.append(t_row) \ No newline at end of file diff --git a/selling/report/quotation_trends/quotation_trends.py b/selling/report/quotation_trends/quotation_trends.py index 6a81d97f16a..7f944e0f23a 100644 --- a/selling/report/quotation_trends/quotation_trends.py +++ b/selling/report/quotation_trends/quotation_trends.py @@ -22,19 +22,18 @@ def execute(filters=None): if not filters: filters ={} # Global data + trans = "Quotation" + tab = ["tabQuotation","tabQuotation Item"] ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] year_start_date = ysd.strftime('%Y-%m-%d') start_month = cint(year_start_date.split('-')[1]) - columns, query_bon, query_pwc, group_by = get_columns(filters, year_start_date, start_month) - - ptab = "tabQuotation" - ctab = "tabQuotation Item" - data = get_data(filters, ptab, ctab, query_bon, query_pwc, group_by) + columns, query_bon, query_pwc, group_by, gby = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, group_by, gby) return columns, data -def get_columns(filters, year_start_date, start_month): +def get_columns(filters, year_start_date, start_month, trans): columns, pwc, bon, gby = [], [], [], [] query_bon, query_pwc = '', '' @@ -44,11 +43,13 @@ def get_columns(filters, year_start_date, start_month): if not (period and based_on): webnotes.msgprint("Value missing in 'Period' or 'Based On'", raise_exception=1) + elif based_on == grby: webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'", raise_exception=1) + else: bon,query_bon,group_by = base_wise_column(based_on, bon) - pwc,query_pwc = period_wise_column_and_query(filters, period, pwc, year_start_date,start_month) + pwc,query_pwc = period_wise_column_and_query(filters, period, pwc, year_start_date,start_month, trans) gby = gruoup_wise_column(grby) if gby: @@ -56,49 +57,95 @@ def get_columns(filters, year_start_date, start_month): else: columns = bon + pwc + ["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] - return columns, query_bon, query_pwc, group_by + return columns, query_bon, query_pwc, group_by,gby -def get_data(filters, ptab, ctab, query_bon, query_pwc, group_by): +def get_data(columns, filters, tab, query_bon, query_pwc, group_by,gby): + query_details = query_bon + query_pwc + 'SUM(t2.qty), SUM(t1.grand_total) ' query_pwc = query_pwc + 'SUM(t2.qty), SUM(t1.grand_total)' - if not filters.get("group_by"): + data = [] + inc = '' + + if filters.get("group_by"): + sel_col = '' + if filters.get("group_by") == 'Item': + sel_col = 't2.item_code' + + elif filters.get("group_by") == 'Customer': + sel_col = 't1.customer' + + if filters.get('based_on') in ['Item','Customer']: + inc = 2 + else : + inc = 1 + + ind = columns.index(gby[0]) + + data1 = webnotes.conn.sql(""" select %s %s from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 group by %s """%(query_bon, query_pwc, tab[0], tab[1], + filters.get("company"), filters.get("fiscal_year"), group_by), as_list=1) + + for d in range(len(data1)): + + dt = data1[d] + dt.insert(ind,'') + data.append(dt) + + row = webnotes.conn.sql("""select DISTINCT(%s) from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 and %s = '%s' """%(sel_col, tab[0], tab[1], filters.get("company"), + filters.get("fiscal_year"), group_by, data1[d][0]),as_list=1) + + for i in range(len(row)): + des = ['' for q in range(len(columns))] + + row1 = webnotes.conn.sql(""" select %s , %s from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 and %s = '%s' and %s ='%s' """%(sel_col, query_pwc, tab[0], tab[1], + filters.get("company"), filters.get("fiscal_year"), sel_col, row[i][0], group_by, + data1[d][0]),as_list=1) + + des[ind] = row[i] + for j in range(1,len(columns)-inc): + des[j+inc] = row1[0][j] + data.append(des) + else: + data = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' and t1.docstatus = 1 - group by %s - """%(query_details, ptab, ctab, filters.get("company"), filters.get("fiscal_year"), group_by), as_list=1) + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 group by %s + """%(query_details, tab[0], tab[1], filters.get("company"), filters.get("fiscal_year"), group_by), as_list=1) - # No coma is included between %s and t2.item_code cause it's already bounded with query_bon - if filters.get("group_by") == 'Item': - data = webnotes.conn.sql(""" select %s t2.item_code, %s from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' and t1.docstatus = 1 - group by %s, %s"""%( query_bon, query_pwc, ptab, ctab, filters.get("company"), filters.get("fiscal_year"), - group_by,'t2.item_code'), as_list=1) - - if filters.get("group_by") == 'Customer': - data = webnotes.conn.sql(""" select %s t1.customer_name, %s from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' and t1.docstatus = 1 - group by %s, %s"""%(query_bon, query_pwc, ptab, ctab, filters.get("company"), filters.get("fiscal_year"), group_by, 't1.customer_name'), as_list=1) - return data -def period_wise_column_and_query(filters, period, pwc, year_start_date, start_month): +def period_wise_column_and_query(filters, period, pwc, year_start_date, start_month, trans): query_details = '' + if trans in ['Purchase Receipt', 'Delivery Note', 'Purchase Invoice', 'Sales Invoice']: + trans_date = 'posting_date' + else: + trans_date = 'transaction_date' if period == "Monthly": month_name = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] + for month in range(start_month-1,len(month_name)): pwc.append(month_name[month]+' (Qty):Float:120') pwc.append(month_name[month]+' (Amt):Currency:120') - query_details += """Sum(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t2.qty ELSE NULL END), - SUM(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t1.grand_total ELSE NULL END), - """%{"mon_num": cstr(month+1)} + + query_details += """ + Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), + SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date,"mon_num": cstr(month+1)} for month in range(0, start_month-1): pwc.append(month_name[month]+' (Qty):Float:120') pwc.append(month_name[month]+' (Amt):Currency:120') - query_details += """Sum(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t2.qty ELSE NULL END), - SUM(CASE WHEN MONTH(t1.transaction_date)= %(mon_num)s THEN t1.grand_total ELSE NULL END), - """%{"mon_num": cstr(month+1)} + + query_details += """ + Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), + SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date, "mon_num": cstr(month+1)} elif period == "Quarterly": pwc = ["Q1(qty):Float:120", "Q1(amt):Currency:120", "Q2(qty):Float:120", "Q2(amt):Currency:120", @@ -110,9 +157,9 @@ def period_wise_column_and_query(filters, period, pwc, year_start_date, start_mo bet_dates = [[first_qsd,first_qed],[second_qsd,second_qed],[third_qsd,third_qed],[fourth_qsd,fourth_qed]] for d in bet_dates: query_details += """ - SUM(CASE WHEN t1.transaction_date BETWEEN '%(sd)s' AND '%(ed)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.transaction_date BETWEEN '%(sd)s' AND '%(ed)s' THEN t1.grand_total ELSE NULL END), - """%{"sd": d[0],"ed": d[1]} + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date, "sd": d[0],"ed": d[1]} elif period == "Half-yearly": pwc = ["Fisrt Half(qty):Float:120", "Fisrt Half(amt):Currency:120", "Second Half(qty):Float:120", @@ -123,11 +170,12 @@ def period_wise_column_and_query(filters, period, pwc, year_start_date, start_mo second_half_start = add_days(first_half_end,1) second_half_end = add_days(add_months(second_half_start,6),-1) - query_details = """ SUM(CASE WHEN t1.transaction_date BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.transaction_date BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t1.grand_total ELSE NULL END), - SUM(CASE WHEN t1.transaction_date BETWEEN '%(shs)s' AND '%(she)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.transaction_date BETWEEN '%(shs)s' AND '%(she)s' THEN t1.grand_total ELSE NULL END), - """%{"fhs": first_half_start, "fhe": first_half_end,"shs": second_half_start, "she": second_half_end} + query_details = """ + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t1.grand_total ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date, "fhs": first_half_start, "fhe": first_half_end,"shs": second_half_start, "she": second_half_end} else: pwc = [filters.get("fiscal_year")+"(qty):Float:120", filters.get("fiscal_year")+"(amt):Currency:120"] diff --git a/selling/report/quotation_trends/quotation_trends.txt b/selling/report/quotation_trends/quotation_trends.txt index a135c345607..eebffcf84b7 100644 --- a/selling/report/quotation_trends/quotation_trends.txt +++ b/selling/report/quotation_trends/quotation_trends.txt @@ -2,12 +2,12 @@ { "creation": "2013-06-07 16:01:16", "docstatus": 0, - "modified": "2013-06-07 16:01:16", + "modified": "2013-06-12 16:31:23", "modified_by": "Administrator", "owner": "Administrator" }, { - "add_total_row": 1, + "add_total_row": 0, "doctype": "Report", "is_standard": "Yes", "name": "__common__", From 0326f5414e4ede793ec7f8bdad7c51e795c69864 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Thu, 13 Jun 2013 19:17:56 +0530 Subject: [PATCH 04/10] [reports][purchase and sales trends] --- .../purchase_invoice_trends/__init__.py | 0 .../purchase_invoice_trends.js | 5 + .../purchase_invoice_trends.py | 37 +++ .../purchase_invoice_trends.txt | 21 ++ .../report/sales_invoice_trends/__init__.py | 0 .../sales_invoice_trends.js | 5 + .../sales_invoice_trends.py | 37 +++ .../sales_invoice_trends.txt | 21 ++ .../report/purchase_order_trends/__init__.py | 0 .../purchase_order_trends.js | 5 + .../purchase_order_trends.py | 37 +++ .../purchase_order_trends.txt | 21 ++ controllers/trends.py | 245 ++++++++++++++++++ public/js/purchase_trends_filters.js | 39 +++ public/js/sales_trends_filters.js | 39 +++ .../quotation_trends/quotation_trends.js | 43 +-- .../quotation_trends/quotation_trends.py | 197 +------------- selling/report/sales_order_trends/__init__.py | 0 .../sales_order_trends/sales_order_trends.js | 5 + .../sales_order_trends/sales_order_trends.py | 37 +++ .../sales_order_trends/sales_order_trends.txt | 21 ++ stock/report/delivery_note_trends/__init__.py | 0 .../delivery_note_trends.js | 5 + .../delivery_note_trends.py | 37 +++ .../delivery_note_trends.txt | 21 ++ .../purchase_receipt_trends/__init__.py | 0 .../purchase_receipt_trends.js | 5 + .../purchase_receipt_trends.py | 37 +++ .../purchase_receipt_trends.txt | 21 ++ 29 files changed, 712 insertions(+), 229 deletions(-) create mode 100644 accounts/report/purchase_invoice_trends/__init__.py create mode 100644 accounts/report/purchase_invoice_trends/purchase_invoice_trends.js create mode 100644 accounts/report/purchase_invoice_trends/purchase_invoice_trends.py create mode 100644 accounts/report/purchase_invoice_trends/purchase_invoice_trends.txt create mode 100644 accounts/report/sales_invoice_trends/__init__.py create mode 100644 accounts/report/sales_invoice_trends/sales_invoice_trends.js create mode 100644 accounts/report/sales_invoice_trends/sales_invoice_trends.py create mode 100644 accounts/report/sales_invoice_trends/sales_invoice_trends.txt create mode 100644 buying/report/purchase_order_trends/__init__.py create mode 100644 buying/report/purchase_order_trends/purchase_order_trends.js create mode 100644 buying/report/purchase_order_trends/purchase_order_trends.py create mode 100644 buying/report/purchase_order_trends/purchase_order_trends.txt create mode 100644 controllers/trends.py create mode 100644 public/js/purchase_trends_filters.js create mode 100644 public/js/sales_trends_filters.js create mode 100644 selling/report/sales_order_trends/__init__.py create mode 100644 selling/report/sales_order_trends/sales_order_trends.js create mode 100644 selling/report/sales_order_trends/sales_order_trends.py create mode 100644 selling/report/sales_order_trends/sales_order_trends.txt create mode 100644 stock/report/delivery_note_trends/__init__.py create mode 100644 stock/report/delivery_note_trends/delivery_note_trends.js create mode 100644 stock/report/delivery_note_trends/delivery_note_trends.py create mode 100644 stock/report/delivery_note_trends/delivery_note_trends.txt create mode 100644 stock/report/purchase_receipt_trends/__init__.py create mode 100644 stock/report/purchase_receipt_trends/purchase_receipt_trends.js create mode 100644 stock/report/purchase_receipt_trends/purchase_receipt_trends.py create mode 100644 stock/report/purchase_receipt_trends/purchase_receipt_trends.txt diff --git a/accounts/report/purchase_invoice_trends/__init__.py b/accounts/report/purchase_invoice_trends/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/accounts/report/purchase_invoice_trends/purchase_invoice_trends.js b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.js new file mode 100644 index 00000000000..bb18ce4cbe2 --- /dev/null +++ b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.js @@ -0,0 +1,5 @@ +wn.require("app/js/purchase_trends_filters.js"); + +wn.query_reports["Purchase Invoice Trends"] = { + filters: get_filters() + } \ No newline at end of file diff --git a/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py new file mode 100644 index 00000000000..e74ad2129b9 --- /dev/null +++ b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py @@ -0,0 +1,37 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import cint, add_days, add_months, cstr +from controllers.trends import get_columns,get_data + +def execute(filters=None): + if not filters: filters ={} + data = [] + + trans = "Purchase Invoice" + tab = ["tabPurchase Invoice","tabPurchase Invoice Item"] + ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + + columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + + if data == '': + webnotes.msgprint("Data Not Available") + return columns, data \ No newline at end of file diff --git a/accounts/report/purchase_invoice_trends/purchase_invoice_trends.txt b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.txt new file mode 100644 index 00000000000..1d5c2d5f45e --- /dev/null +++ b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.txt @@ -0,0 +1,21 @@ +[ + { + "creation": "2013-06-13 18:46:55", + "docstatus": 0, + "modified": "2013-06-13 18:46:55", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "ref_doctype": "Purchase Invoice", + "report_name": "Purchase Invoice Trends", + "report_type": "Script Report" + }, + { + "doctype": "Report", + "name": "Purchase Invoice Trends" + } +] \ No newline at end of file diff --git a/accounts/report/sales_invoice_trends/__init__.py b/accounts/report/sales_invoice_trends/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/accounts/report/sales_invoice_trends/sales_invoice_trends.js b/accounts/report/sales_invoice_trends/sales_invoice_trends.js new file mode 100644 index 00000000000..6f20015d21f --- /dev/null +++ b/accounts/report/sales_invoice_trends/sales_invoice_trends.js @@ -0,0 +1,5 @@ +wn.require("app/js/sales_trends_filters.js"); + +wn.query_reports["Sales Invoice Trends"] = { + filters: get_filters() + } \ No newline at end of file diff --git a/accounts/report/sales_invoice_trends/sales_invoice_trends.py b/accounts/report/sales_invoice_trends/sales_invoice_trends.py new file mode 100644 index 00000000000..48606f04ed0 --- /dev/null +++ b/accounts/report/sales_invoice_trends/sales_invoice_trends.py @@ -0,0 +1,37 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import cint, add_days, add_months, cstr +from controllers.trends import get_columns,get_data + +def execute(filters=None): + if not filters: filters ={} + data = [] + + trans = "Sales Invoice" + tab = ["tabSales Invoice","tabSales Invoice Item"] + ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + + columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + + if data == '': + webnotes.msgprint("Data Not Available") + return columns, data \ No newline at end of file diff --git a/accounts/report/sales_invoice_trends/sales_invoice_trends.txt b/accounts/report/sales_invoice_trends/sales_invoice_trends.txt new file mode 100644 index 00000000000..279ac1269f1 --- /dev/null +++ b/accounts/report/sales_invoice_trends/sales_invoice_trends.txt @@ -0,0 +1,21 @@ +[ + { + "creation": "2013-06-13 18:44:21", + "docstatus": 0, + "modified": "2013-06-13 18:44:21", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "ref_doctype": "Sales Invoice", + "report_name": "Sales Invoice Trends", + "report_type": "Script Report" + }, + { + "doctype": "Report", + "name": "Sales Invoice Trends" + } +] \ No newline at end of file diff --git a/buying/report/purchase_order_trends/__init__.py b/buying/report/purchase_order_trends/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/buying/report/purchase_order_trends/purchase_order_trends.js b/buying/report/purchase_order_trends/purchase_order_trends.js new file mode 100644 index 00000000000..c6373db6c2a --- /dev/null +++ b/buying/report/purchase_order_trends/purchase_order_trends.js @@ -0,0 +1,5 @@ +wn.require("app/js/purchase_trends_filters.js"); + +wn.query_reports["Purchase Order Trends"] = { + filters: get_filters() + } \ No newline at end of file diff --git a/buying/report/purchase_order_trends/purchase_order_trends.py b/buying/report/purchase_order_trends/purchase_order_trends.py new file mode 100644 index 00000000000..cdf79b2fad0 --- /dev/null +++ b/buying/report/purchase_order_trends/purchase_order_trends.py @@ -0,0 +1,37 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import cint, add_days, add_months, cstr +from controllers.trends import get_columns,get_data + +def execute(filters=None): + if not filters: filters ={} + data = [] + + trans = "Purchase Order" + tab = ["tabPurchase Order","tabPurchase Order Item"] + ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + + columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + + if data == '': + webnotes.msgprint("Data Not Available") + return columns, data \ No newline at end of file diff --git a/buying/report/purchase_order_trends/purchase_order_trends.txt b/buying/report/purchase_order_trends/purchase_order_trends.txt new file mode 100644 index 00000000000..658dd4aab11 --- /dev/null +++ b/buying/report/purchase_order_trends/purchase_order_trends.txt @@ -0,0 +1,21 @@ +[ + { + "creation": "2013-06-13 18:45:01", + "docstatus": 0, + "modified": "2013-06-13 18:45:01", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "ref_doctype": "Purchase Order", + "report_name": "Purchase Order Trends", + "report_type": "Script Report" + }, + { + "doctype": "Report", + "name": "Purchase Order Trends" + } +] \ No newline at end of file diff --git a/controllers/trends.py b/controllers/trends.py new file mode 100644 index 00000000000..6c33235b9f3 --- /dev/null +++ b/controllers/trends.py @@ -0,0 +1,245 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import cint, add_days, add_months, cstr + +def get_columns(filters, year_start_date, start_month, trans): + columns, pwc, bon, grbc = [], [], [], [] + query_bon, query_pwc = '', '' + + period = filters.get("period") + based_on = filters.get("based_on") + grby = filters.get("group_by") + + if not (period and based_on): + webnotes.msgprint("Value missing in 'Period' or 'Based On'", raise_exception=1) + + elif based_on == grby: + webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'", raise_exception=1) + + else: + bon, query_bon, basedon, sup_tab = bon_columns_qdata(based_on, bon, trans) + pwc, query_pwc = pw_column_qdata(filters, period, pwc, year_start_date,start_month, trans) + grbc = grp_column(grby) + + if grbc: + columns = bon + grbc + pwc +["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] + else: + columns = bon + pwc + ["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] + + return columns, query_bon, query_pwc, basedon, grbc, sup_tab + +def get_data(columns, filters, tab, query_bon, query_pwc, basedon, grbc, sup_tab): + + query_details = query_bon + query_pwc + 'SUM(t2.qty), SUM(t1.grand_total) ' + query_pwc = query_pwc + 'SUM(t2.qty), SUM(t1.grand_total)' + data = [] + inc, cond= '','' + + if query_bon in ["t1.project_name,", "t2.project_name,"]: + cond = 'and '+ query_bon[:-1] +' IS Not NULL' + + if filters.get("group_by"): + sel_col = '' + + if filters.get("group_by") == 'Item': + sel_col = 't2.item_code' + + elif filters.get("group_by") == 'Customer': + sel_col = 't1.customer' + + elif filters.get("group_by") == 'Supplier': + sel_col = 't1.supplier' + + if filters.get('based_on') in ['Item','Customer','Supplier']: + inc = 2 + else : + inc = 1 + + ind = columns.index(grbc[0]) + + data1 = webnotes.conn.sql(""" select %s %s from `%s` t1, `%s` t2 %s + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 %s group by %s + """%(query_bon, query_pwc, tab[0], tab[1], sup_tab,filters.get("company"), filters.get("fiscal_year"), + cond, basedon), as_list=1) + + for d in range(len(data1)): + #to add blanck column + dt = data1[d] + dt.insert(ind,'') + data.append(dt) + + #to get distinct value of col specified by group_by in filter + row = webnotes.conn.sql("""select DISTINCT(%s) from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 and %s = '%s' + """%(sel_col, tab[0], tab[1], filters.get("company"), filters.get("fiscal_year"), + basedon, data1[d][0]),as_list=1) + + for i in range(len(row)): + des = ['' for q in range(len(columns))] + + #get data for each group_by filter + row1 = webnotes.conn.sql(""" select %s , %s from `%s` t1, `%s` t2 + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 and %s = '%s' and %s ='%s' + """%(sel_col, query_pwc, tab[0], tab[1], filters.get("company"), filters.get("fiscal_year"), + sel_col, row[i][0], basedon, data1[d][0]),as_list=1) + + des[ind] = row[i] + for j in range(1,len(columns)-inc): + des[j+inc] = row1[0][j] + data.append(des) + else: + + data = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 %s + where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' + and t1.docstatus = 1 %s group by %s + """%(query_details, tab[0], tab[1], sup_tab, filters.get("company"), + filters.get("fiscal_year"), cond,basedon), as_list=1) + + return data + +def pw_column_qdata(filters, period, pwc, year_start_date, start_month, trans): + query_details = '' + if trans in ['Purchase Receipt', 'Delivery Note', 'Purchase Invoice', 'Sales Invoice']: + trans_date = 'posting_date' + else: + trans_date = 'transaction_date' + + if period == "Monthly": + month_name = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] + + for month in range(start_month-1,len(month_name)): + pwc.append(month_name[month]+' (Qty):Float:120') + pwc.append(month_name[month]+' (Amt):Currency:120') + + query_details += """ + Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), + SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date,"mon_num": cstr(month+1)} + + for month in range(0, start_month-1): + pwc.append(month_name[month]+' (Qty):Float:120') + pwc.append(month_name[month]+' (Amt):Currency:120') + + query_details += """ + Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), + SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date, "mon_num": cstr(month+1)} + + elif period == "Quarterly": + pwc = ["Q1(qty):Float:120", "Q1(amt):Currency:120", "Q2(qty):Float:120", "Q2(amt):Currency:120", + "Q3(qty):Float:120", "Q3(amt):Currency:120", "Q4(qty):Float:120", "Q4(amt):Currency:120"] + + first_qsd, second_qsd, third_qsd, fourth_qsd = year_start_date, add_months(year_start_date,3), add_months(year_start_date,6), add_months(year_start_date,9) + first_qed, second_qed, third_qed, fourth_qed = add_days(add_months(first_qsd,3),-1), add_days(add_months(second_qsd,3),-1), add_days(add_months(third_qsd,3),-1), add_days(add_months(fourth_qsd,3),-1) + + bet_dates = [[first_qsd,first_qed],[second_qsd,second_qed],[third_qsd,third_qed],[fourth_qsd,fourth_qed]] + for d in bet_dates: + query_details += """ + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date, "sd": d[0],"ed": d[1]} + + elif period == "Half-yearly": + pwc = ["Fisrt Half(qty):Float:120", "Fisrt Half(amt):Currency:120", "Second Half(qty):Float:120", + "Second Half(amt):Currency:120"] + + first_half_start = year_start_date + first_half_end = add_days(add_months(first_half_start,6),-1) + second_half_start = add_days(first_half_end,1) + second_half_end = add_days(add_months(second_half_start,6),-1) + + query_details = """ + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t1.grand_total ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t2.qty ELSE NULL END), + SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t1.grand_total ELSE NULL END), + """%{"trans": trans_date, "fhs": first_half_start, "fhe": first_half_end,"shs": second_half_start, + "she": second_half_end} + + else: + pwc = [filters.get("fiscal_year")+"(qty):Float:120", filters.get("fiscal_year")+"(amt):Currency:120"] + query_details = " SUM(t2.qty), SUM(t1.grand_total)," + + return pwc, query_details + +def bon_columns_qdata(based_on, bon, trans): + sup_tab = '' + + if based_on == "Item": + bon = ["Item:Link/Item:120", "Item Name:Data:120"] + query_details = "t2.item_code, t2.item_name," + basedon = 't2.item_code' + + elif based_on == "Item Group": + bon = ["Item Group:Link/Item Group:120"] + query_details = "t2.item_group," + basedon = 't2.item_group' + + elif based_on == "Customer": + bon = ["Customer:Link/Customer:120", "Territory:Link/Territory:120"] + query_details = "t1.customer_name, t1.territory, " + basedon = 't1.customer_name' + + elif based_on == "Customer Group": + bon = ["Customer Group:Link/Customer Group"] + query_details = "t1.customer_group," + basedon = 't1.customer_group' + + elif based_on == 'Supplier': + bon = ["Supplier:Link/Supplier:120", "Supplier Type:Link/Supplier Type:120"] + query_details = "t1.supplier, t3.supplier_type," + basedon = 't1.supplier' + sup_tab = ',`tabSupplier` t3' + + elif based_on == 'Supplier Type': + bon = ["Supplier Type:Link/Supplier Type:120"] + query_details = "t3.supplier_type," + basedon = 't3.supplier_type' + sup_tab = ',`tabSupplier` t3' + + elif based_on == "Territory": + bon = ["Territory:Link/Territory:120"] + query_details = "t1.territory," + basedon = 't1.territory' + + elif based_on == "Project": + + if trans in ['Sales Invoice', 'Delivery Note', 'Sales Order']: + bon = ["Project:Link/Project:120"] + query_details = "t1.project_name," + basedon = 't1.project_name' + + elif trans in ['Purchase Order', 'Purchase Invoice', 'Purchase Receipt']: + bon = ["Project:Link/Project:120"] + query_details = "t2.project_name," + basedon = 't2.project_name' + + else: + webnotes.msgprint("No Information Available", raise_exception=1) + + return bon, query_details, basedon, sup_tab + +def grp_column(group_by): + if group_by: + return [group_by+":Link/"+group_by+":120"] + else: + return [] \ No newline at end of file diff --git a/public/js/purchase_trends_filters.js b/public/js/purchase_trends_filters.js new file mode 100644 index 00000000000..05f67c92a4d --- /dev/null +++ b/public/js/purchase_trends_filters.js @@ -0,0 +1,39 @@ +var get_filter = function(){ + return [ + { + "fieldname":"period", + "label": "Period", + "fieldtype": "Select", + "options": ["Monthly", "Quarterly", "Half-yearly", "Yearly"].join("\n"), + "default": "Monthly" + }, + { + "fieldname":"based_on", + "label": "Based On", + "fieldtype": "Select", + "options": ["Item", "Item Group", "Supplier", "Supplier Type", "Project"].join("\n"), + "default": "Item" + }, + { + "fieldname":"group_by", + "label": "Group By", + "fieldtype": "Select", + "options": ["Item", "Supplier"].join("\n"), + "default": "" + }, + { + "fieldname":"fiscal_year", + "label": "Fiscal Year", + "fieldtype": "Link", + "options":'Fiscal Year', + "default": sys_defaults.fiscal_year + }, + { + "fieldname":"company", + "label": "Company", + "fieldtype": "Link", + "options": "Company", + "default": sys_defaults.company + }, + ]; +} \ No newline at end of file diff --git a/public/js/sales_trends_filters.js b/public/js/sales_trends_filters.js new file mode 100644 index 00000000000..14dcbe3cf6f --- /dev/null +++ b/public/js/sales_trends_filters.js @@ -0,0 +1,39 @@ +var get_filters = function(){ + return[ + { + "fieldname":"period", + "label": "Period", + "fieldtype": "Select", + "options": ["Monthly", "Quarterly", "Half-yearly", "Yearly"].join("\n"), + "default": "Monthly" + }, + { + "fieldname":"based_on", + "label": "Based On", + "fieldtype": "Select", + "options": ["Item", "Item Group", "Customer", "Customer Group", "Territory", "Project"].join("\n"), + "default": "Item" + }, + { + "fieldname":"group_by", + "label": "Group By", + "fieldtype": "Select", + "options": ["Item", "Customer"].join("\n"), + "default": "" + }, + { + "fieldname":"fiscal_year", + "label": "Fiscal Year", + "fieldtype": "Link", + "options":'Fiscal Year', + "default": sys_defaults.fiscal_year + }, + { + "fieldname":"company", + "label": "Company", + "fieldtype": "Link", + "options": "Company", + "default": sys_defaults.company + }, + ]; +} \ No newline at end of file diff --git a/selling/report/quotation_trends/quotation_trends.js b/selling/report/quotation_trends/quotation_trends.js index e166fa66cec..2f9f23666c2 100644 --- a/selling/report/quotation_trends/quotation_trends.js +++ b/selling/report/quotation_trends/quotation_trends.js @@ -1,40 +1,5 @@ +wn.require("app/js/sales_trends_filters.js"); + wn.query_reports["Quotation Trends"] = { - "filters": [ - { - "fieldname":"period", - "label": "Period", - "fieldtype": "Select", - "options": "Monthly"+NEWLINE+"Quarterly"+NEWLINE+"Half-yearly"+NEWLINE+"Yearly", - "default": "Monthly" - }, - { - "fieldname":"based_on", - "label": "Based On", - "fieldtype": "Select", - "options": "Item"+NEWLINE+"Item Group"+NEWLINE+"Customer"+NEWLINE+"Customer Group"+NEWLINE+"Territory"+NEWLINE+"Project", - "default": "Item" - }, - { - "fieldname":"group_by", - "label": "Group By", - "fieldtype": "Select", - "options": "Item"+NEWLINE+"Customer", - "default": "" - }, - { - "fieldname":"fiscal_year", - "label": "Fiscal Year", - "fieldtype": "Link", - "options":'Fiscal Year', - "default": sys_defaults.fiscal_year - }, - { - "fieldname":"company", - "label": "Company", - "fieldtype": "Link", - "options": "Company", - "default": sys_defaults.company - }, - - ] -} \ No newline at end of file + filters: get_filters() + } \ No newline at end of file diff --git a/selling/report/quotation_trends/quotation_trends.py b/selling/report/quotation_trends/quotation_trends.py index 7f944e0f23a..527e0addc5f 100644 --- a/selling/report/quotation_trends/quotation_trends.py +++ b/selling/report/quotation_trends/quotation_trends.py @@ -17,204 +17,21 @@ from __future__ import unicode_literals import webnotes from webnotes.utils import cint, add_days, add_months, cstr +from controllers.trends import get_columns,get_data def execute(filters=None): if not filters: filters ={} + data = [] - # Global data trans = "Quotation" tab = ["tabQuotation","tabQuotation Item"] ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] year_start_date = ysd.strftime('%Y-%m-%d') start_month = cint(year_start_date.split('-')[1]) - columns, query_bon, query_pwc, group_by, gby = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, group_by, gby) + columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) - return columns, data - -def get_columns(filters, year_start_date, start_month, trans): - columns, pwc, bon, gby = [], [], [], [] - query_bon, query_pwc = '', '' - - period = filters.get("period") - based_on = filters.get("based_on") - grby = filters.get("group_by") - - if not (period and based_on): - webnotes.msgprint("Value missing in 'Period' or 'Based On'", raise_exception=1) - - elif based_on == grby: - webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'", raise_exception=1) - - else: - bon,query_bon,group_by = base_wise_column(based_on, bon) - pwc,query_pwc = period_wise_column_and_query(filters, period, pwc, year_start_date,start_month, trans) - gby = gruoup_wise_column(grby) - - if gby: - columns = bon + gby + pwc +["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] - else: - columns = bon + pwc + ["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] - - return columns, query_bon, query_pwc, group_by,gby - -def get_data(columns, filters, tab, query_bon, query_pwc, group_by,gby): - - query_details = query_bon + query_pwc + 'SUM(t2.qty), SUM(t1.grand_total) ' - query_pwc = query_pwc + 'SUM(t2.qty), SUM(t1.grand_total)' - data = [] - inc = '' - - if filters.get("group_by"): - sel_col = '' - if filters.get("group_by") == 'Item': - sel_col = 't2.item_code' - - elif filters.get("group_by") == 'Customer': - sel_col = 't1.customer' - - if filters.get('based_on') in ['Item','Customer']: - inc = 2 - else : - inc = 1 - - ind = columns.index(gby[0]) - - data1 = webnotes.conn.sql(""" select %s %s from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 group by %s """%(query_bon, query_pwc, tab[0], tab[1], - filters.get("company"), filters.get("fiscal_year"), group_by), as_list=1) - - for d in range(len(data1)): - - dt = data1[d] - dt.insert(ind,'') - data.append(dt) - - row = webnotes.conn.sql("""select DISTINCT(%s) from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 and %s = '%s' """%(sel_col, tab[0], tab[1], filters.get("company"), - filters.get("fiscal_year"), group_by, data1[d][0]),as_list=1) - - for i in range(len(row)): - des = ['' for q in range(len(columns))] - - row1 = webnotes.conn.sql(""" select %s , %s from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 and %s = '%s' and %s ='%s' """%(sel_col, query_pwc, tab[0], tab[1], - filters.get("company"), filters.get("fiscal_year"), sel_col, row[i][0], group_by, - data1[d][0]),as_list=1) - - des[ind] = row[i] - for j in range(1,len(columns)-inc): - des[j+inc] = row1[0][j] - data.append(des) - else: - - data = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 group by %s - """%(query_details, tab[0], tab[1], filters.get("company"), filters.get("fiscal_year"), group_by), as_list=1) - - return data - -def period_wise_column_and_query(filters, period, pwc, year_start_date, start_month, trans): - query_details = '' - if trans in ['Purchase Receipt', 'Delivery Note', 'Purchase Invoice', 'Sales Invoice']: - trans_date = 'posting_date' - else: - trans_date = 'transaction_date' - - if period == "Monthly": - month_name = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] - - for month in range(start_month-1,len(month_name)): - pwc.append(month_name[month]+' (Qty):Float:120') - pwc.append(month_name[month]+' (Amt):Currency:120') - - query_details += """ - Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), - SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), - """%{"trans": trans_date,"mon_num": cstr(month+1)} - - for month in range(0, start_month-1): - pwc.append(month_name[month]+' (Qty):Float:120') - pwc.append(month_name[month]+' (Amt):Currency:120') - - query_details += """ - Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), - SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), - """%{"trans": trans_date, "mon_num": cstr(month+1)} - - elif period == "Quarterly": - pwc = ["Q1(qty):Float:120", "Q1(amt):Currency:120", "Q2(qty):Float:120", "Q2(amt):Currency:120", - "Q3(qty):Float:120", "Q3(amt):Currency:120", "Q4(qty):Float:120", "Q4(amt):Currency:120"] - - first_qsd, second_qsd, third_qsd, fourth_qsd = year_start_date, add_months(year_start_date,3), add_months(year_start_date,6), add_months(year_start_date,9) - first_qed, second_qed, third_qed, fourth_qed = add_days(add_months(first_qsd,3),-1), add_days(add_months(second_qsd,3),-1), add_days(add_months(third_qsd,3),-1), add_days(add_months(fourth_qsd,3),-1) - - bet_dates = [[first_qsd,first_qed],[second_qsd,second_qed],[third_qsd,third_qed],[fourth_qsd,fourth_qed]] - for d in bet_dates: - query_details += """ - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t1.grand_total ELSE NULL END), - """%{"trans": trans_date, "sd": d[0],"ed": d[1]} - - elif period == "Half-yearly": - pwc = ["Fisrt Half(qty):Float:120", "Fisrt Half(amt):Currency:120", "Second Half(qty):Float:120", - "Second Half(amt):Currency:120"] - - first_half_start = year_start_date - first_half_end = add_days(add_months(first_half_start,6),-1) - second_half_start = add_days(first_half_end,1) - second_half_end = add_days(add_months(second_half_start,6),-1) - - query_details = """ - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t1.grand_total ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t1.grand_total ELSE NULL END), - """%{"trans": trans_date, "fhs": first_half_start, "fhe": first_half_end,"shs": second_half_start, "she": second_half_end} - - else: - pwc = [filters.get("fiscal_year")+"(qty):Float:120", filters.get("fiscal_year")+"(amt):Currency:120"] - query_details = " SUM(t2.qty), SUM(t1.grand_total)," - - return pwc, query_details - -def base_wise_column(based_on, bon): - if based_on == "Item": - bon = ["Item:Link/Item:120", "Item Name:Data:120"] - query_details = "t2.item_code, t2.item_name," - group_by = 't2.item_code' - - elif based_on == "Item Group": - bon = ["Item Group:Link/Item Group:120"] - query_details = "t2.item_group," - group_by = 't2.item_group' - - elif based_on == "Customer": - bon = ["Customer:Link/Customer:120", "Territory:Link/Territory:120"] - query_details = "t1.customer_name, t1.territory, " - group_by = 't1.customer_name' - - elif based_on == "Customer Group": - bon = ["Customer Group:Link/Customer Group"] - query_details = "t1.customer_group, " - group_by = 't1.customer_group' - - elif based_on == "Territory": - bon = ["Territory:Link/Territory:120"] - query_details = "t1.territory, " - group_by = 't1.territory' - - else: - bon = ["Project:Link/Project:120"] - return bon, query_details, group_by - -def gruoup_wise_column(group_by): - if group_by: - return [group_by+":Link/"+group_by+":120"] - else: - return [] \ No newline at end of file + if data == '': + webnotes.msgprint("Data Not Available") + return columns, data \ No newline at end of file diff --git a/selling/report/sales_order_trends/__init__.py b/selling/report/sales_order_trends/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/selling/report/sales_order_trends/sales_order_trends.js b/selling/report/sales_order_trends/sales_order_trends.js new file mode 100644 index 00000000000..29c124403f8 --- /dev/null +++ b/selling/report/sales_order_trends/sales_order_trends.js @@ -0,0 +1,5 @@ +wn.require("app/js/sales_trends_filters.js"); + +wn.query_reports["Sales Order"] = { + filters: get_filters() + } \ No newline at end of file diff --git a/selling/report/sales_order_trends/sales_order_trends.py b/selling/report/sales_order_trends/sales_order_trends.py new file mode 100644 index 00000000000..047a8a9e9fe --- /dev/null +++ b/selling/report/sales_order_trends/sales_order_trends.py @@ -0,0 +1,37 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import cint, add_days, add_months, cstr +from controllers.trends import get_columns,get_data + +def execute(filters=None): + if not filters: filters ={} + data = [] + + trans = "Sales Order" + tab = ["tabSales Order","tabSales Order Item"] + ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + + columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + + if data == '': + webnotes.msgprint("Data Not Available") + return columns, data \ No newline at end of file diff --git a/selling/report/sales_order_trends/sales_order_trends.txt b/selling/report/sales_order_trends/sales_order_trends.txt new file mode 100644 index 00000000000..16ee9ca46b3 --- /dev/null +++ b/selling/report/sales_order_trends/sales_order_trends.txt @@ -0,0 +1,21 @@ +[ + { + "creation": "2013-06-13 18:43:30", + "docstatus": 0, + "modified": "2013-06-13 18:43:30", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "ref_doctype": "Sales Order", + "report_name": "Sales Order Trends", + "report_type": "Script Report" + }, + { + "doctype": "Report", + "name": "Sales Order Trends" + } +] \ No newline at end of file diff --git a/stock/report/delivery_note_trends/__init__.py b/stock/report/delivery_note_trends/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/stock/report/delivery_note_trends/delivery_note_trends.js b/stock/report/delivery_note_trends/delivery_note_trends.js new file mode 100644 index 00000000000..3ec5e594d7b --- /dev/null +++ b/stock/report/delivery_note_trends/delivery_note_trends.js @@ -0,0 +1,5 @@ +wn.require("app/js/sales_trends_filters.js"); + +wn.query_reports["Delivery Note Trends"] = { + filters: get_filters() + } \ No newline at end of file diff --git a/stock/report/delivery_note_trends/delivery_note_trends.py b/stock/report/delivery_note_trends/delivery_note_trends.py new file mode 100644 index 00000000000..685cede509b --- /dev/null +++ b/stock/report/delivery_note_trends/delivery_note_trends.py @@ -0,0 +1,37 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import cint, add_days, add_months, cstr +from controllers.trends import get_columns,get_data + +def execute(filters=None): + if not filters: filters ={} + data = [] + + trans = "Delivery Note" + tab = ["tabDelivery Note","tabDelivery Note Item"] + ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + + columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + + if data == '': + webnotes.msgprint("Data Not Available") + return columns, data \ No newline at end of file diff --git a/stock/report/delivery_note_trends/delivery_note_trends.txt b/stock/report/delivery_note_trends/delivery_note_trends.txt new file mode 100644 index 00000000000..bb8720074a6 --- /dev/null +++ b/stock/report/delivery_note_trends/delivery_note_trends.txt @@ -0,0 +1,21 @@ +[ + { + "creation": "2013-06-13 18:42:11", + "docstatus": 0, + "modified": "2013-06-13 18:42:11", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "ref_doctype": "Delivery Note", + "report_name": "Delivery Note Trends", + "report_type": "Script Report" + }, + { + "doctype": "Report", + "name": "Delivery Note Trends" + } +] \ No newline at end of file diff --git a/stock/report/purchase_receipt_trends/__init__.py b/stock/report/purchase_receipt_trends/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/stock/report/purchase_receipt_trends/purchase_receipt_trends.js b/stock/report/purchase_receipt_trends/purchase_receipt_trends.js new file mode 100644 index 00000000000..ecfa5a473e7 --- /dev/null +++ b/stock/report/purchase_receipt_trends/purchase_receipt_trends.js @@ -0,0 +1,5 @@ +wn.require("app/js/purchase_trends_filters.js"); + +wn.query_reports["Purchase Receipt Trends"] = { + filters: get_filters() + } \ No newline at end of file diff --git a/stock/report/purchase_receipt_trends/purchase_receipt_trends.py b/stock/report/purchase_receipt_trends/purchase_receipt_trends.py new file mode 100644 index 00000000000..aaa18a0a0df --- /dev/null +++ b/stock/report/purchase_receipt_trends/purchase_receipt_trends.py @@ -0,0 +1,37 @@ +# ERPNext - web based ERP (http://erpnext.com) +# Copyright (C) 2012 Web Notes Technologies Pvt Ltd +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +from __future__ import unicode_literals +import webnotes +from webnotes.utils import cint, add_days, add_months, cstr +from controllers.trends import get_columns,get_data + +def execute(filters=None): + if not filters: filters ={} + data = [] + + trans = "Purchase Receipt" + tab = ["tabPurchase Receipt","tabPurchase Receipt Item"] + ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + + columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) + data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + + if data == '': + webnotes.msgprint("Data Not Available") + return columns, data \ No newline at end of file diff --git a/stock/report/purchase_receipt_trends/purchase_receipt_trends.txt b/stock/report/purchase_receipt_trends/purchase_receipt_trends.txt new file mode 100644 index 00000000000..179c524f96f --- /dev/null +++ b/stock/report/purchase_receipt_trends/purchase_receipt_trends.txt @@ -0,0 +1,21 @@ +[ + { + "creation": "2013-06-13 18:45:44", + "docstatus": 0, + "modified": "2013-06-13 18:45:44", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "ref_doctype": "Purchase Receipt", + "report_name": "Purchase Receipt Trends", + "report_type": "Script Report" + }, + { + "doctype": "Report", + "name": "Purchase Receipt Trends" + } +] \ No newline at end of file From 1848b71a0a3354134c2b76233176aec0a057d789 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 14 Jun 2013 15:03:45 +0530 Subject: [PATCH 05/10] [Reports][Sales and Purchase Trends][Completed] --- accounts/page/accounts_home/accounts_home.js | 10 ++ .../purchase_invoice_trends.py | 13 +- .../sales_invoice_trends.py | 13 +- buying/page/buying_home/buying_home.js | 5 + .../purchase_order_trends.py | 13 +- controllers/trends.py | 138 ++++++++++-------- public/js/purchase_trends_filters.js | 2 +- selling/page/selling_home/selling_home.js | 5 + .../quotation_trends/quotation_trends.py | 13 +- .../sales_order_trends/sales_order_trends.js | 2 +- .../sales_order_trends/sales_order_trends.py | 15 +- stock/page/stock_home/stock_home.js | 10 ++ .../delivery_note_trends.py | 15 +- .../purchase_receipt_trends.py | 13 +- 14 files changed, 146 insertions(+), 121 deletions(-) diff --git a/accounts/page/accounts_home/accounts_home.js b/accounts/page/accounts_home/accounts_home.js index 7f623d71150..63fe9695cc0 100644 --- a/accounts/page/accounts_home/accounts_home.js +++ b/accounts/page/accounts_home/accounts_home.js @@ -257,6 +257,16 @@ wn.module_page["Accounts"] = [ route: "query-report/Item-wise Purchase Register", doctype: "Purchase Invoice" }, + { + "label":wn._("Purchase Invoice Trends"), + route: "query-report/Purchase Invoice Trends", + doctype: "Purchase Invoice" + }, + { + "label":wn._("Sales Invoice Trends"), + route: "query-report/Sales Invoice Trends", + doctype: "Sales Invoice" + }, ] } ] diff --git a/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py index e74ad2129b9..a38c37cdb55 100644 --- a/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py +++ b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, add_days, add_months, cstr from controllers.trends import get_columns,get_data def execute(filters=None): @@ -25,13 +24,11 @@ def execute(filters=None): trans = "Purchase Invoice" tab = ["tabPurchase Invoice","tabPurchase Invoice Item"] - ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] - year_start_date = ysd.strftime('%Y-%m-%d') - start_month = cint(year_start_date.split('-')[1]) - - columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + details = get_columns(filters, trans) + data = get_data(filters, tab, details) + if data == '': webnotes.msgprint("Data Not Available") - return columns, data \ No newline at end of file + + return details["columns"], data \ No newline at end of file diff --git a/accounts/report/sales_invoice_trends/sales_invoice_trends.py b/accounts/report/sales_invoice_trends/sales_invoice_trends.py index 48606f04ed0..3839900b46f 100644 --- a/accounts/report/sales_invoice_trends/sales_invoice_trends.py +++ b/accounts/report/sales_invoice_trends/sales_invoice_trends.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, add_days, add_months, cstr from controllers.trends import get_columns,get_data def execute(filters=None): @@ -25,13 +24,11 @@ def execute(filters=None): trans = "Sales Invoice" tab = ["tabSales Invoice","tabSales Invoice Item"] - ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] - year_start_date = ysd.strftime('%Y-%m-%d') - start_month = cint(year_start_date.split('-')[1]) - - columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + details = get_columns(filters, trans) + data = get_data(filters, tab, details) + if data == '': webnotes.msgprint("Data Not Available") - return columns, data \ No newline at end of file + + return details["columns"], data \ No newline at end of file diff --git a/buying/page/buying_home/buying_home.js b/buying/page/buying_home/buying_home.js index 2070fd4e338..dfcd71e17dd 100644 --- a/buying/page/buying_home/buying_home.js +++ b/buying/page/buying_home/buying_home.js @@ -115,6 +115,11 @@ wn.module_page["Buying"] = [ "label":wn._("Requested Items To Be Ordered"), route: "query-report/Requested Items To Be Ordered", }, + { + "label":wn._("Purchase Order Trends"), + route: "query-report/Purchase Order Trends", + doctype: "Purchase Order" + }, ] } ] diff --git a/buying/report/purchase_order_trends/purchase_order_trends.py b/buying/report/purchase_order_trends/purchase_order_trends.py index cdf79b2fad0..063bef43f2e 100644 --- a/buying/report/purchase_order_trends/purchase_order_trends.py +++ b/buying/report/purchase_order_trends/purchase_order_trends.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, add_days, add_months, cstr from controllers.trends import get_columns,get_data def execute(filters=None): @@ -25,13 +24,11 @@ def execute(filters=None): trans = "Purchase Order" tab = ["tabPurchase Order","tabPurchase Order Item"] - ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] - year_start_date = ysd.strftime('%Y-%m-%d') - start_month = cint(year_start_date.split('-')[1]) - - columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + details = get_columns(filters, trans) + data = get_data(filters, tab, details) + if data == '': webnotes.msgprint("Data Not Available") - return columns, data \ No newline at end of file + + return details["columns"], data \ No newline at end of file diff --git a/controllers/trends.py b/controllers/trends.py index 6c33235b9f3..dee9ec8b4f8 100644 --- a/controllers/trends.py +++ b/controllers/trends.py @@ -18,51 +18,45 @@ from __future__ import unicode_literals import webnotes from webnotes.utils import cint, add_days, add_months, cstr -def get_columns(filters, year_start_date, start_month, trans): - columns, pwc, bon, grbc = [], [], [], [] - query_bon, query_pwc = '', '' +def get_columns(filters, trans): - period = filters.get("period") - based_on = filters.get("based_on") - grby = filters.get("group_by") - - if not (period and based_on): + if not (filters.get("period") and filters.get("based_on")): webnotes.msgprint("Value missing in 'Period' or 'Based On'", raise_exception=1) - elif based_on == grby: + elif filters.get("based_on") == filters.get("group_by"): webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'", raise_exception=1) else: - bon, query_bon, basedon, sup_tab = bon_columns_qdata(based_on, bon, trans) - pwc, query_pwc = pw_column_qdata(filters, period, pwc, year_start_date,start_month, trans) - grbc = grp_column(grby) - - if grbc: - columns = bon + grbc + pwc +["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] - else: + bon, query_bon, basedon, sup_tab = basedon_wise_colums_query(filters.get("based_on"), trans) + pwc, query_pwc = period_wise_colums_query(filters, trans) + grbc = group_wise_column(filters.get("group_by")) + columns = bon + pwc + ["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] + if grbc: + columns = bon + grbc + pwc +["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] - return columns, query_bon, query_pwc, basedon, grbc, sup_tab + details = {"query_bon": query_bon, "query_pwc": query_pwc, "columns": columns, "basedon": basedon, + "grbc": grbc, "sup_tab": sup_tab} -def get_data(columns, filters, tab, query_bon, query_pwc, basedon, grbc, sup_tab): + return details + +def get_data(filters, tab, details): - query_details = query_bon + query_pwc + 'SUM(t2.qty), SUM(t1.grand_total) ' - query_pwc = query_pwc + 'SUM(t2.qty), SUM(t1.grand_total)' data = [] inc, cond= '','' + query_details = details["query_bon"] + details["query_pwc"] - if query_bon in ["t1.project_name,", "t2.project_name,"]: - cond = 'and '+ query_bon[:-1] +' IS Not NULL' + if details["query_bon"] in ["t1.project_name,", "t2.project_name,"]: + cond = 'and '+ details["query_bon"][:-1] +' IS Not NULL' if filters.get("group_by"): sel_col = '' + ind = details["columns"].index(details["grbc"][0]) if filters.get("group_by") == 'Item': sel_col = 't2.item_code' - elif filters.get("group_by") == 'Customer': sel_col = 't1.customer' - elif filters.get("group_by") == 'Supplier': sel_col = 't1.supplier' @@ -71,13 +65,14 @@ def get_data(columns, filters, tab, query_bon, query_pwc, basedon, grbc, sup_ta else : inc = 1 - ind = columns.index(grbc[0]) - - data1 = webnotes.conn.sql(""" select %s %s from `%s` t1, `%s` t2 %s - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 %s group by %s - """%(query_bon, query_pwc, tab[0], tab[1], sup_tab,filters.get("company"), filters.get("fiscal_year"), - cond, basedon), as_list=1) + data1 = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 %s + where t2.parent = t1.name and t1.company = %s + and t1.fiscal_year = %s and t1.docstatus = 1 %s + group by %s + """ % (query_details, tab[0], tab[1], details["sup_tab"], "%s", + "%s", cond, details["basedon"]), (filters.get("company"), + filters["fiscal_year"]), + as_list=1) for d in range(len(data1)): #to add blanck column @@ -86,44 +81,64 @@ def get_data(columns, filters, tab, query_bon, query_pwc, basedon, grbc, sup_ta data.append(dt) #to get distinct value of col specified by group_by in filter - row = webnotes.conn.sql("""select DISTINCT(%s) from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 and %s = '%s' - """%(sel_col, tab[0], tab[1], filters.get("company"), filters.get("fiscal_year"), - basedon, data1[d][0]),as_list=1) - + row = webnotes.conn.sql("""select DISTINCT(%s) from `%s` t1, `%s` t2 %s + where t2.parent = t1.name and t1.company = %s + and t1.fiscal_year = %s and t1.docstatus = 1 + and %s = %s + """%(sel_col, tab[0], tab[1], details["sup_tab"], "%s", + "%s", details["basedon"], "%s"), + (filters.get("company"), filters.get("fiscal_year"), + data1[d][0]), + as_list=1) + for i in range(len(row)): - des = ['' for q in range(len(columns))] + des = ['' for q in range(len(details["columns"]))] #get data for each group_by filter - row1 = webnotes.conn.sql(""" select %s , %s from `%s` t1, `%s` t2 - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 and %s = '%s' and %s ='%s' - """%(sel_col, query_pwc, tab[0], tab[1], filters.get("company"), filters.get("fiscal_year"), - sel_col, row[i][0], basedon, data1[d][0]),as_list=1) + row1 = webnotes.conn.sql(""" select %s , %s from `%s` t1, `%s` t2 %s + where t2.parent = t1.name and t1.company = %s + and t1.fiscal_year = %s and t1.docstatus = 1 + and %s = %s and %s = %s + """%(sel_col, details["query_pwc"], tab[0], tab[1], details["sup_tab"], + "%s", "%s", sel_col, "%s", details["basedon"], "%s"), + (filters.get("company"), filters.get("fiscal_year"), row[i][0], + data1[d][0]), + as_list=1) des[ind] = row[i] - for j in range(1,len(columns)-inc): + for j in range(1,len(details["columns"])-inc): des[j+inc] = row1[0][j] data.append(des) else: data = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 %s - where t2.parent = t1.name and t1.company = '%s' and t1.fiscal_year = '%s' - and t1.docstatus = 1 %s group by %s - """%(query_details, tab[0], tab[1], sup_tab, filters.get("company"), - filters.get("fiscal_year"), cond,basedon), as_list=1) + where t2.parent = t1.name and t1.company = %s + and t1.fiscal_year = %s and t1.docstatus = 1 + %s group by %s + """%(query_details, tab[0], tab[1], details["sup_tab"], "%s", + "%s", cond,details["basedon"]), (filters.get("company"), + filters.get("fiscal_year")), + as_list=1) return data -def pw_column_qdata(filters, period, pwc, year_start_date, start_month, trans): +def period_wise_colums_query(filters, trans): + query_details = '' + pwc = [] + ysd = webnotes.conn.sql("""select year_start_date from `tabFiscal Year` + where name = '%s' + """%filters.get("fiscal_year"))[0][0] + + year_start_date = ysd.strftime('%Y-%m-%d') + start_month = cint(year_start_date.split('-')[1]) + if trans in ['Purchase Receipt', 'Delivery Note', 'Purchase Invoice', 'Sales Invoice']: trans_date = 'posting_date' else: trans_date = 'transaction_date' - if period == "Monthly": + if filters.get("period") == "Monthly": month_name = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'] for month in range(start_month-1,len(month_name)): @@ -144,23 +159,23 @@ def pw_column_qdata(filters, period, pwc, year_start_date, start_month, trans): SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), """%{"trans": trans_date, "mon_num": cstr(month+1)} - elif period == "Quarterly": - pwc = ["Q1(qty):Float:120", "Q1(amt):Currency:120", "Q2(qty):Float:120", "Q2(amt):Currency:120", - "Q3(qty):Float:120", "Q3(amt):Currency:120", "Q4(qty):Float:120", "Q4(amt):Currency:120"] + elif filters.get("period") == "Quarterly": + pwc = ["Q1 (Qty):Float:120", "Q1 (Amt):Currency:120", "Q2 (Qty):Float:120", "Q2 (Amt):Currency:120", + "Q3 (Qty):Float:120", "Q3 (Amt):Currency:120", "Q4 (Qty):Float:120", "Q4 (Amt):Currency:120"] first_qsd, second_qsd, third_qsd, fourth_qsd = year_start_date, add_months(year_start_date,3), add_months(year_start_date,6), add_months(year_start_date,9) first_qed, second_qed, third_qed, fourth_qed = add_days(add_months(first_qsd,3),-1), add_days(add_months(second_qsd,3),-1), add_days(add_months(third_qsd,3),-1), add_days(add_months(fourth_qsd,3),-1) - bet_dates = [[first_qsd,first_qed],[second_qsd,second_qed],[third_qsd,third_qed],[fourth_qsd,fourth_qed]] + for d in bet_dates: query_details += """ SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t2.qty ELSE NULL END), SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t1.grand_total ELSE NULL END), """%{"trans": trans_date, "sd": d[0],"ed": d[1]} - elif period == "Half-yearly": - pwc = ["Fisrt Half(qty):Float:120", "Fisrt Half(amt):Currency:120", "Second Half(qty):Float:120", - "Second Half(amt):Currency:120"] + elif filters.get("period") == "Half-yearly": + pwc = ["Fisrt Half (Qty):Float:120", "Fisrt Half (Amt):Currency:120", "Second Half (Qty):Float:120", + "Second Half (Amt):Currency:120"] first_half_start = year_start_date first_half_end = add_days(add_months(first_half_start,6),-1) @@ -176,12 +191,13 @@ def pw_column_qdata(filters, period, pwc, year_start_date, start_month, trans): "she": second_half_end} else: - pwc = [filters.get("fiscal_year")+"(qty):Float:120", filters.get("fiscal_year")+"(amt):Currency:120"] + pwc = [filters.get("fiscal_year")+" (Qty):Float:120", filters.get("fiscal_year")+" (Amt):Currency:120"] query_details = " SUM(t2.qty), SUM(t1.grand_total)," + query_details += 'SUM(t2.qty), SUM(t1.grand_total)' return pwc, query_details -def bon_columns_qdata(based_on, bon, trans): +def basedon_wise_colums_query(based_on, trans): sup_tab = '' if based_on == "Item": @@ -234,11 +250,11 @@ def bon_columns_qdata(based_on, bon, trans): basedon = 't2.project_name' else: - webnotes.msgprint("No Information Available", raise_exception=1) + webnotes.msgprint("Information Not Available", raise_exception=1) return bon, query_details, basedon, sup_tab -def grp_column(group_by): +def group_wise_column(group_by): if group_by: return [group_by+":Link/"+group_by+":120"] else: diff --git a/public/js/purchase_trends_filters.js b/public/js/purchase_trends_filters.js index 05f67c92a4d..e994a47ebde 100644 --- a/public/js/purchase_trends_filters.js +++ b/public/js/purchase_trends_filters.js @@ -1,4 +1,4 @@ -var get_filter = function(){ +var get_filters = function(){ return [ { "fieldname":"period", diff --git a/selling/page/selling_home/selling_home.js b/selling/page/selling_home/selling_home.js index 15f9b861620..ff8cff88926 100644 --- a/selling/page/selling_home/selling_home.js +++ b/selling/page/selling_home/selling_home.js @@ -173,6 +173,11 @@ wn.module_page["Selling"] = [ { "label":wn._("Quotation Trend"), route: "query-report/Quotation Trends", + doctype: "Quotation" + }, + { + "label":wn._("Sales Order Trend"), + route: "query-report/Sales Order Trends", doctype: "Sales Order" }, diff --git a/selling/report/quotation_trends/quotation_trends.py b/selling/report/quotation_trends/quotation_trends.py index 527e0addc5f..548a4a8253b 100644 --- a/selling/report/quotation_trends/quotation_trends.py +++ b/selling/report/quotation_trends/quotation_trends.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, add_days, add_months, cstr from controllers.trends import get_columns,get_data def execute(filters=None): @@ -25,13 +24,11 @@ def execute(filters=None): trans = "Quotation" tab = ["tabQuotation","tabQuotation Item"] - ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] - year_start_date = ysd.strftime('%Y-%m-%d') - start_month = cint(year_start_date.split('-')[1]) - - columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + details = get_columns(filters, trans) + data = get_data(filters, tab, details) + if data == '': webnotes.msgprint("Data Not Available") - return columns, data \ No newline at end of file + + return details["columns"], data \ No newline at end of file diff --git a/selling/report/sales_order_trends/sales_order_trends.js b/selling/report/sales_order_trends/sales_order_trends.js index 29c124403f8..458fee6ed3b 100644 --- a/selling/report/sales_order_trends/sales_order_trends.js +++ b/selling/report/sales_order_trends/sales_order_trends.js @@ -1,5 +1,5 @@ wn.require("app/js/sales_trends_filters.js"); -wn.query_reports["Sales Order"] = { +wn.query_reports["Sales Order Trends"] = { filters: get_filters() } \ No newline at end of file diff --git a/selling/report/sales_order_trends/sales_order_trends.py b/selling/report/sales_order_trends/sales_order_trends.py index 047a8a9e9fe..e3d9d9f523f 100644 --- a/selling/report/sales_order_trends/sales_order_trends.py +++ b/selling/report/sales_order_trends/sales_order_trends.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, add_days, add_months, cstr from controllers.trends import get_columns,get_data def execute(filters=None): @@ -25,13 +24,11 @@ def execute(filters=None): trans = "Sales Order" tab = ["tabSales Order","tabSales Order Item"] - ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] - year_start_date = ysd.strftime('%Y-%m-%d') - start_month = cint(year_start_date.split('-')[1]) - - columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) - + + details = get_columns(filters, trans) + data = get_data(filters, tab, details) + if data == '': webnotes.msgprint("Data Not Available") - return columns, data \ No newline at end of file + + return details["columns"], data \ No newline at end of file diff --git a/stock/page/stock_home/stock_home.js b/stock/page/stock_home/stock_home.js index d8c63aab66f..532eb664062 100644 --- a/stock/page/stock_home/stock_home.js +++ b/stock/page/stock_home/stock_home.js @@ -223,6 +223,16 @@ wn.module_page["Stock"] = [ route: "query-report/Itemwise Recommended Reorder Level", doctype: "Item" }, + { + "label":wn._("Delivery Note Trends"), + route: "query-report/Delivery Note Trends", + doctype: "Delivery Note" + }, + { + "label":wn._("Purchase Receipt Trends"), + route: "query-report/Purchase Receipt Trends", + doctype: "Purchase Receipt" + }, ] } ] diff --git a/stock/report/delivery_note_trends/delivery_note_trends.py b/stock/report/delivery_note_trends/delivery_note_trends.py index 685cede509b..a161c65eeee 100644 --- a/stock/report/delivery_note_trends/delivery_note_trends.py +++ b/stock/report/delivery_note_trends/delivery_note_trends.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, add_days, add_months, cstr from controllers.trends import get_columns,get_data def execute(filters=None): @@ -25,13 +24,11 @@ def execute(filters=None): trans = "Delivery Note" tab = ["tabDelivery Note","tabDelivery Note Item"] - ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] - year_start_date = ysd.strftime('%Y-%m-%d') - start_month = cint(year_start_date.split('-')[1]) - - columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) - + + details = get_columns(filters, trans) + data = get_data(filters, tab, details) + if data == '': webnotes.msgprint("Data Not Available") - return columns, data \ No newline at end of file + + return details["columns"], data \ No newline at end of file diff --git a/stock/report/purchase_receipt_trends/purchase_receipt_trends.py b/stock/report/purchase_receipt_trends/purchase_receipt_trends.py index aaa18a0a0df..abce01eedde 100644 --- a/stock/report/purchase_receipt_trends/purchase_receipt_trends.py +++ b/stock/report/purchase_receipt_trends/purchase_receipt_trends.py @@ -16,7 +16,6 @@ from __future__ import unicode_literals import webnotes -from webnotes.utils import cint, add_days, add_months, cstr from controllers.trends import get_columns,get_data def execute(filters=None): @@ -25,13 +24,11 @@ def execute(filters=None): trans = "Purchase Receipt" tab = ["tabPurchase Receipt","tabPurchase Receipt Item"] - ysd = webnotes.conn.sql("select year_start_date from `tabFiscal Year` where name = '%s'"%filters.get("fiscal_year"))[0][0] - year_start_date = ysd.strftime('%Y-%m-%d') - start_month = cint(year_start_date.split('-')[1]) - - columns, query_bon, query_pwc, basedon, grbc, sup_tab = get_columns(filters, year_start_date, start_month, trans) - data = get_data(columns,filters, tab, query_bon, query_pwc, basedon, grbc ,sup_tab) + details = get_columns(filters, trans) + data = get_data(filters, tab, details) + if data == '': webnotes.msgprint("Data Not Available") - return columns, data \ No newline at end of file + + return details["columns"], data \ No newline at end of file From feb8669cbde3cb784b8ad5169834921dd83f4138 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Fri, 14 Jun 2013 17:40:48 +0530 Subject: [PATCH 06/10] [Reports][Validation changes in Purchase and Sales trends] --- .../purchase_invoice_trends/purchase_invoice_trends.py | 6 +++--- accounts/report/purchase_register/purchase_register.py | 1 + .../report/sales_invoice_trends/sales_invoice_trends.py | 4 ++-- .../report/purchase_order_trends/purchase_order_trends.py | 4 ++-- selling/report/quotation_trends/quotation_trends.py | 4 ++-- selling/report/sales_order_trends/sales_order_trends.py | 4 ++-- stock/report/delivery_note_trends/delivery_note_trends.py | 4 ++-- .../purchase_receipt_trends/purchase_receipt_trends.py | 4 ++-- 8 files changed, 16 insertions(+), 15 deletions(-) diff --git a/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py index a38c37cdb55..b2f376b4715 100644 --- a/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py +++ b/accounts/report/purchase_invoice_trends/purchase_invoice_trends.py @@ -27,8 +27,8 @@ def execute(filters=None): details = get_columns(filters, trans) data = get_data(filters, tab, details) - - if data == '': - webnotes.msgprint("Data Not Available") + + if not data : + webnotes.msgprint("Data not found for selected criterias") return details["columns"], data \ No newline at end of file diff --git a/accounts/report/purchase_register/purchase_register.py b/accounts/report/purchase_register/purchase_register.py index 7c4b38671d7..548b5613440 100644 --- a/accounts/report/purchase_register/purchase_register.py +++ b/accounts/report/purchase_register/purchase_register.py @@ -107,6 +107,7 @@ def get_invoices(filters): from `tabPurchase Invoice` where docstatus = 1 %s order by posting_date desc, name desc""" % conditions, filters, as_dict=1) + def get_invoice_expense_map(invoice_list): expense_details = webnotes.conn.sql("""select parent, expense_head, sum(amount) as amount from `tabPurchase Invoice Item` where parent in (%s) group by parent, expense_head""" % diff --git a/accounts/report/sales_invoice_trends/sales_invoice_trends.py b/accounts/report/sales_invoice_trends/sales_invoice_trends.py index 3839900b46f..11d6665ff3f 100644 --- a/accounts/report/sales_invoice_trends/sales_invoice_trends.py +++ b/accounts/report/sales_invoice_trends/sales_invoice_trends.py @@ -28,7 +28,7 @@ def execute(filters=None): details = get_columns(filters, trans) data = get_data(filters, tab, details) - if data == '': - webnotes.msgprint("Data Not Available") + if not data : + webnotes.msgprint("Data not found for selected criterias") return details["columns"], data \ No newline at end of file diff --git a/buying/report/purchase_order_trends/purchase_order_trends.py b/buying/report/purchase_order_trends/purchase_order_trends.py index 063bef43f2e..301124fd3b9 100644 --- a/buying/report/purchase_order_trends/purchase_order_trends.py +++ b/buying/report/purchase_order_trends/purchase_order_trends.py @@ -28,7 +28,7 @@ def execute(filters=None): details = get_columns(filters, trans) data = get_data(filters, tab, details) - if data == '': - webnotes.msgprint("Data Not Available") + if not data : + webnotes.msgprint("Data not found for selected criterias") return details["columns"], data \ No newline at end of file diff --git a/selling/report/quotation_trends/quotation_trends.py b/selling/report/quotation_trends/quotation_trends.py index 548a4a8253b..e341752cd01 100644 --- a/selling/report/quotation_trends/quotation_trends.py +++ b/selling/report/quotation_trends/quotation_trends.py @@ -28,7 +28,7 @@ def execute(filters=None): details = get_columns(filters, trans) data = get_data(filters, tab, details) - if data == '': - webnotes.msgprint("Data Not Available") + if not data: + webnotes.msgprint("Data not found for selected criterias") return details["columns"], data \ No newline at end of file diff --git a/selling/report/sales_order_trends/sales_order_trends.py b/selling/report/sales_order_trends/sales_order_trends.py index e3d9d9f523f..d556a58d37a 100644 --- a/selling/report/sales_order_trends/sales_order_trends.py +++ b/selling/report/sales_order_trends/sales_order_trends.py @@ -28,7 +28,7 @@ def execute(filters=None): details = get_columns(filters, trans) data = get_data(filters, tab, details) - if data == '': - webnotes.msgprint("Data Not Available") + if not data : + webnotes.msgprint("Data not found for selected criterias") return details["columns"], data \ No newline at end of file diff --git a/stock/report/delivery_note_trends/delivery_note_trends.py b/stock/report/delivery_note_trends/delivery_note_trends.py index a161c65eeee..369b6a36b1d 100644 --- a/stock/report/delivery_note_trends/delivery_note_trends.py +++ b/stock/report/delivery_note_trends/delivery_note_trends.py @@ -28,7 +28,7 @@ def execute(filters=None): details = get_columns(filters, trans) data = get_data(filters, tab, details) - if data == '': - webnotes.msgprint("Data Not Available") + if not data : + webnotes.msgprint("Data not found for selected criterias") return details["columns"], data \ No newline at end of file diff --git a/stock/report/purchase_receipt_trends/purchase_receipt_trends.py b/stock/report/purchase_receipt_trends/purchase_receipt_trends.py index abce01eedde..bd089fafa21 100644 --- a/stock/report/purchase_receipt_trends/purchase_receipt_trends.py +++ b/stock/report/purchase_receipt_trends/purchase_receipt_trends.py @@ -28,7 +28,7 @@ def execute(filters=None): details = get_columns(filters, trans) data = get_data(filters, tab, details) - if data == '': - webnotes.msgprint("Data Not Available") + if not data : + webnotes.msgprint("Data not found for selected criterias") return details["columns"], data \ No newline at end of file From 24208f5c4a985d1a762251d166808c4f7e85ee89 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Tue, 18 Jun 2013 15:45:08 +0530 Subject: [PATCH 07/10] [Report][Item-Wise Purchase Receipt] --- buying/page/buying_home/buying_home.js | 4 ++++ .../item_wise_last_purchase_rate/__init__.py | 0 .../item_wise_last_purchase_rate.txt | 22 +++++++++++++++++++ controllers/trends.py | 6 ++--- 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 buying/report/item_wise_last_purchase_rate/__init__.py create mode 100644 buying/report/item_wise_last_purchase_rate/item_wise_last_purchase_rate.txt diff --git a/buying/page/buying_home/buying_home.js b/buying/page/buying_home/buying_home.js index dfcd71e17dd..0e078fefc93 100644 --- a/buying/page/buying_home/buying_home.js +++ b/buying/page/buying_home/buying_home.js @@ -120,6 +120,10 @@ wn.module_page["Buying"] = [ route: "query-report/Purchase Order Trends", doctype: "Purchase Order" }, + { + "label":wn._("Item-wise Last Purchase Rate"), + route: "query-report/Item-wise Last Purchase Rate", + } ] } ] diff --git a/buying/report/item_wise_last_purchase_rate/__init__.py b/buying/report/item_wise_last_purchase_rate/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/buying/report/item_wise_last_purchase_rate/item_wise_last_purchase_rate.txt b/buying/report/item_wise_last_purchase_rate/item_wise_last_purchase_rate.txt new file mode 100644 index 00000000000..db99e724ced --- /dev/null +++ b/buying/report/item_wise_last_purchase_rate/item_wise_last_purchase_rate.txt @@ -0,0 +1,22 @@ +[ + { + "creation": "2013-06-18 11:24:36", + "docstatus": 0, + "modified": "2013-06-18 15:28:57", + "modified_by": "Administrator", + "owner": "Administrator" + }, + { + "doctype": "Report", + "is_standard": "Yes", + "name": "__common__", + "query": "select * from (select \n result.item_code as \"Item Code:Link/Item:120\",\n result.item_name as \"Item Name::120\",\n result.description as \"Description::150\",\n result.posting_date as \"Date::150\",\n result.purchase_ref_rate as \"Price List Rate::180\", \n result.discount_rate as \"Discount::120\", \n result.purchase_rate as \"Rate::120\"\nfrom (\n (select \n po_item.item_code,\n po_item.item_name,\n po_item.description,\n po.transaction_date as posting_date,\n po_item.purchase_ref_rate, \n po_item.discount_rate, \n po_item.purchase_rate\n from `tabPurchase Order` po, `tabPurchase Order Item` po_item\n where po.name = po_item.parent and po.docstatus = 1)\n union\n (select \n pr_item.item_code,\n pr_item.item_name,\n pr_item.description,\n pr.posting_date,\n pr_item.purchase_ref_rate,\n pr_item.discount_rate,\n pr_item.purchase_rate\n from `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pr_item\n where pr.name = pr_item.parent and pr.docstatus = 1)\n) result\norder by result.item_code asc, result.posting_date desc) result_wrapper\ngroup by `Item Code:Link/Item:120`\n", + "ref_doctype": "Purchase Order", + "report_name": "Item-wise Last Purchase Rate", + "report_type": "Query Report" + }, + { + "doctype": "Report", + "name": "Item-wise Last Purchase Rate" + } +] \ No newline at end of file diff --git a/controllers/trends.py b/controllers/trends.py index dee9ec8b4f8..8905591193e 100644 --- a/controllers/trends.py +++ b/controllers/trends.py @@ -83,7 +83,7 @@ def get_data(filters, tab, details): #to get distinct value of col specified by group_by in filter row = webnotes.conn.sql("""select DISTINCT(%s) from `%s` t1, `%s` t2 %s where t2.parent = t1.name and t1.company = %s - and t1.fiscal_year = %s and t1.docstatus = 1 + and t1.fiscal_year = %s and t1.docstatus = 1 and %s = %s """%(sel_col, tab[0], tab[1], details["sup_tab"], "%s", "%s", details["basedon"], "%s"), @@ -224,13 +224,13 @@ def basedon_wise_colums_query(based_on, trans): bon = ["Supplier:Link/Supplier:120", "Supplier Type:Link/Supplier Type:120"] query_details = "t1.supplier, t3.supplier_type," basedon = 't1.supplier' - sup_tab = ',`tabSupplier` t3' + sup_tab = '`tabSupplier` t3', elif based_on == 'Supplier Type': bon = ["Supplier Type:Link/Supplier Type:120"] query_details = "t3.supplier_type," basedon = 't3.supplier_type' - sup_tab = ',`tabSupplier` t3' + sup_tab ='`tabSupplier` t3', elif based_on == "Territory": bon = ["Territory:Link/Territory:120"] From 5b6d03e479603275684169f8f14c337fa811623e Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 19 Jun 2013 12:34:22 +0530 Subject: [PATCH 08/10] [Report][Trend Analyzer] --- controllers/trends.py | 75 ++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 40 deletions(-) diff --git a/controllers/trends.py b/controllers/trends.py index 8905591193e..b00afe8d908 100644 --- a/controllers/trends.py +++ b/controllers/trends.py @@ -66,13 +66,13 @@ def get_data(filters, tab, details): inc = 1 data1 = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 %s - where t2.parent = t1.name and t1.company = %s - and t1.fiscal_year = %s and t1.docstatus = 1 %s - group by %s - """ % (query_details, tab[0], tab[1], details["sup_tab"], "%s", - "%s", cond, details["basedon"]), (filters.get("company"), - filters["fiscal_year"]), - as_list=1) + where t2.parent = t1.name and t1.company = %s + and t1.fiscal_year = %s and t1.docstatus = 1 %s + group by %s + """ % (query_details, tab[0], tab[1], details["sup_tab"], "%s", + "%s", cond, details["basedon"]), (filters.get("company"), + filters["fiscal_year"]), + as_list=1) for d in range(len(data1)): #to add blanck column @@ -82,28 +82,23 @@ def get_data(filters, tab, details): #to get distinct value of col specified by group_by in filter row = webnotes.conn.sql("""select DISTINCT(%s) from `%s` t1, `%s` t2 %s - where t2.parent = t1.name and t1.company = %s - and t1.fiscal_year = %s and t1.docstatus = 1 - and %s = %s - """%(sel_col, tab[0], tab[1], details["sup_tab"], "%s", - "%s", details["basedon"], "%s"), - (filters.get("company"), filters.get("fiscal_year"), - data1[d][0]), - as_list=1) + where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s + and t1.docstatus = 1 and %s = %s + """%(sel_col, tab[0], tab[1], details["sup_tab"], "%s", "%s", details["basedon"], "%s"), + (filters.get("company"), filters.get("fiscal_year"), data1[d][0]), + as_list=1) for i in range(len(row)): des = ['' for q in range(len(details["columns"]))] #get data for each group_by filter row1 = webnotes.conn.sql(""" select %s , %s from `%s` t1, `%s` t2 %s - where t2.parent = t1.name and t1.company = %s - and t1.fiscal_year = %s and t1.docstatus = 1 - and %s = %s and %s = %s - """%(sel_col, details["query_pwc"], tab[0], tab[1], details["sup_tab"], - "%s", "%s", sel_col, "%s", details["basedon"], "%s"), - (filters.get("company"), filters.get("fiscal_year"), row[i][0], - data1[d][0]), - as_list=1) + where t2.parent = t1.name and t1.company = %s and t1.fiscal_year = %s + and t1.docstatus = 1 and %s = %s and %s = %s + """%(sel_col, details["query_pwc"], tab[0], tab[1], details["sup_tab"], + "%s", "%s", sel_col, "%s", details["basedon"], "%s"), + (filters.get("company"), filters.get("fiscal_year"), row[i][0], data1[d][0]), + as_list=1) des[ind] = row[i] for j in range(1,len(details["columns"])-inc): @@ -112,13 +107,13 @@ def get_data(filters, tab, details): else: data = webnotes.conn.sql(""" select %s from `%s` t1, `%s` t2 %s - where t2.parent = t1.name and t1.company = %s - and t1.fiscal_year = %s and t1.docstatus = 1 - %s group by %s - """%(query_details, tab[0], tab[1], details["sup_tab"], "%s", - "%s", cond,details["basedon"]), (filters.get("company"), - filters.get("fiscal_year")), - as_list=1) + where t2.parent = t1.name and t1.company = %s + and t1.fiscal_year = %s and t1.docstatus = 1 %s + group by %s + """%(query_details, tab[0], tab[1], details["sup_tab"], "%s", + "%s", cond,details["basedon"]), (filters.get("company"), + filters.get("fiscal_year")), + as_list=1) return data @@ -146,8 +141,8 @@ def period_wise_colums_query(filters, trans): pwc.append(month_name[month]+' (Amt):Currency:120') query_details += """ - Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), - SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + Sum(IF(MONTH(t1.%(trans)s)= %(mon_num)s, t2.qty, NULL)), + SUM(IF(MONTH(t1.%(trans)s)= %(mon_num)s, t1.grand_total, NULL)), """%{"trans": trans_date,"mon_num": cstr(month+1)} for month in range(0, start_month-1): @@ -155,8 +150,8 @@ def period_wise_colums_query(filters, trans): pwc.append(month_name[month]+' (Amt):Currency:120') query_details += """ - Sum(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t2.qty ELSE NULL END), - SUM(CASE WHEN MONTH(t1.%(trans)s)= %(mon_num)s THEN t1.grand_total ELSE NULL END), + Sum(IF(MONTH(t1.%(trans)s)= %(mon_num)s, t2.qty, NULL)), + SUM(IF(MONTH(t1.%(trans)s)= %(mon_num)s, t1.grand_total, NULL)), """%{"trans": trans_date, "mon_num": cstr(month+1)} elif filters.get("period") == "Quarterly": @@ -169,8 +164,8 @@ def period_wise_colums_query(filters, trans): for d in bet_dates: query_details += """ - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s' THEN t1.grand_total ELSE NULL END), + SUM(IF(t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s', t2.qty, NULL)), + SUM(IF(t1.%(trans)s BETWEEN '%(sd)s' AND '%(ed)s', t1.grand_total, NULL)), """%{"trans": trans_date, "sd": d[0],"ed": d[1]} elif filters.get("period") == "Half-yearly": @@ -183,10 +178,10 @@ def period_wise_colums_query(filters, trans): second_half_end = add_days(add_months(second_half_start,6),-1) query_details = """ - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s' THEN t1.grand_total ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t2.qty ELSE NULL END), - SUM(CASE WHEN t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s' THEN t1.grand_total ELSE NULL END), + SUM(IF(t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s', t2.qty, NULL)), + SUM(IF(t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s', t1.grand_total, NULL)), + SUM(IF(t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s', t2.qty, NULL)), + SUM(IF(t1.%(trans)s BETWEEN '%(shs)s' AND '%(she)s', t1.grand_total, NULL)), """%{"trans": trans_date, "fhs": first_half_start, "fhe": first_half_end,"shs": second_half_start, "she": second_half_end} From bfe9fe7c3b0481e20ae3028b3e69c4b658662a42 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 19 Jun 2013 12:41:28 +0530 Subject: [PATCH 09/10] [Report][Spliting of Trend Analyzer Completed] --- controllers/trends.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/controllers/trends.py b/controllers/trends.py index b00afe8d908..76db44705f6 100644 --- a/controllers/trends.py +++ b/controllers/trends.py @@ -27,15 +27,15 @@ def get_columns(filters, trans): webnotes.msgprint("Plese select different values in 'Based On' and 'Group By'", raise_exception=1) else: - bon, query_bon, basedon, sup_tab = basedon_wise_colums_query(filters.get("based_on"), trans) + bonc, query_bon, based, sup_tab = basedon_wise_colums_query(filters.get("based_on"), trans) pwc, query_pwc = period_wise_colums_query(filters, trans) grbc = group_wise_column(filters.get("group_by")) - columns = bon + pwc + ["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] + columns = bonc + pwc + ["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] if grbc: - columns = bon + grbc + pwc +["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] + columns = bonc + grbc + pwc +["TOTAL(Qty):Float:120", "TOTAL(Amt):Currency:120"] - details = {"query_bon": query_bon, "query_pwc": query_pwc, "columns": columns, "basedon": basedon, + details = {"query_bon": query_bon, "query_pwc": query_pwc, "columns": columns, "basedon": based, "grbc": grbc, "sup_tab": sup_tab} return details @@ -121,9 +121,8 @@ def period_wise_colums_query(filters, trans): query_details = '' pwc = [] - ysd = webnotes.conn.sql("""select year_start_date from `tabFiscal Year` - where name = '%s' - """%filters.get("fiscal_year"))[0][0] + ysd = webnotes.conn.sql("""select year_start_date from `tabFiscal Year` where name = '%s' + """%filters.get("fiscal_year"))[0][0] year_start_date = ysd.strftime('%Y-%m-%d') start_month = cint(year_start_date.split('-')[1]) @@ -198,56 +197,56 @@ def basedon_wise_colums_query(based_on, trans): if based_on == "Item": bon = ["Item:Link/Item:120", "Item Name:Data:120"] query_details = "t2.item_code, t2.item_name," - basedon = 't2.item_code' + based = 't2.item_code' elif based_on == "Item Group": bon = ["Item Group:Link/Item Group:120"] query_details = "t2.item_group," - basedon = 't2.item_group' + based = 't2.item_group' elif based_on == "Customer": bon = ["Customer:Link/Customer:120", "Territory:Link/Territory:120"] query_details = "t1.customer_name, t1.territory, " - basedon = 't1.customer_name' + based = 't1.customer_name' elif based_on == "Customer Group": bon = ["Customer Group:Link/Customer Group"] query_details = "t1.customer_group," - basedon = 't1.customer_group' + based = 't1.customer_group' elif based_on == 'Supplier': bon = ["Supplier:Link/Supplier:120", "Supplier Type:Link/Supplier Type:120"] query_details = "t1.supplier, t3.supplier_type," - basedon = 't1.supplier' + based = 't1.supplier' sup_tab = '`tabSupplier` t3', elif based_on == 'Supplier Type': bon = ["Supplier Type:Link/Supplier Type:120"] query_details = "t3.supplier_type," - basedon = 't3.supplier_type' + based = 't3.supplier_type' sup_tab ='`tabSupplier` t3', elif based_on == "Territory": bon = ["Territory:Link/Territory:120"] query_details = "t1.territory," - basedon = 't1.territory' + based = 't1.territory' elif based_on == "Project": if trans in ['Sales Invoice', 'Delivery Note', 'Sales Order']: bon = ["Project:Link/Project:120"] query_details = "t1.project_name," - basedon = 't1.project_name' + based = 't1.project_name' elif trans in ['Purchase Order', 'Purchase Invoice', 'Purchase Receipt']: bon = ["Project:Link/Project:120"] query_details = "t2.project_name," - basedon = 't2.project_name' + based = 't2.project_name' else: webnotes.msgprint("Information Not Available", raise_exception=1) - return bon, query_details, basedon, sup_tab + return bon, query_details, based, sup_tab def group_wise_column(group_by): if group_by: From d4f2199269740cc62775b781478172ed13fdf334 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Wed, 19 Jun 2013 14:44:44 +0530 Subject: [PATCH 10/10] [Reports][Trend Analyzer completed] --- controllers/trends.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/controllers/trends.py b/controllers/trends.py index 76db44705f6..4edb7845ceb 100644 --- a/controllers/trends.py +++ b/controllers/trends.py @@ -17,6 +17,7 @@ from __future__ import unicode_literals import webnotes from webnotes.utils import cint, add_days, add_months, cstr +from datetime import datetime def get_columns(filters, trans): @@ -117,7 +118,12 @@ def get_data(filters, tab, details): return data +def get_mon(date): + """convert srting formated date into date and retrieve month abbrevation""" + return (datetime.strptime(date, '%Y-%m-%d')).strftime("%b") + def period_wise_colums_query(filters, trans): + from datetime import datetime query_details = '' pwc = [] @@ -154,12 +160,15 @@ def period_wise_colums_query(filters, trans): """%{"trans": trans_date, "mon_num": cstr(month+1)} elif filters.get("period") == "Quarterly": - pwc = ["Q1 (Qty):Float:120", "Q1 (Amt):Currency:120", "Q2 (Qty):Float:120", "Q2 (Amt):Currency:120", - "Q3 (Qty):Float:120", "Q3 (Amt):Currency:120", "Q4 (Qty):Float:120", "Q4 (Amt):Currency:120"] first_qsd, second_qsd, third_qsd, fourth_qsd = year_start_date, add_months(year_start_date,3), add_months(year_start_date,6), add_months(year_start_date,9) first_qed, second_qed, third_qed, fourth_qed = add_days(add_months(first_qsd,3),-1), add_days(add_months(second_qsd,3),-1), add_days(add_months(third_qsd,3),-1), add_days(add_months(fourth_qsd,3),-1) bet_dates = [[first_qsd,first_qed],[second_qsd,second_qed],[third_qsd,third_qed],[fourth_qsd,fourth_qed]] + + pwc = [get_mon(first_qsd)+"-"+get_mon(first_qed)+" (Qty):Float:120", get_mon(first_qsd)+"-"+get_mon(first_qed)+"(Amt):Currency:120", + get_mon(second_qsd)+"-"+get_mon(second_qed)+" (Qty):Float:120", get_mon(second_qsd)+"-"+get_mon(second_qed)+" (Amt):Currency:120", + get_mon(third_qsd)+"-"+get_mon(third_qed)+" (Qty):Float:120", get_mon(third_qsd)+"-"+get_mon(third_qed)+" (Amt):Currency:120", + get_mon(fourth_qsd)+"-"+get_mon(fourth_qed)+" (Qty):Float:120", get_mon(fourth_qsd)+"-"+get_mon(fourth_qed)+" (Amt):Currency:120"] for d in bet_dates: query_details += """ @@ -168,14 +177,15 @@ def period_wise_colums_query(filters, trans): """%{"trans": trans_date, "sd": d[0],"ed": d[1]} elif filters.get("period") == "Half-yearly": - pwc = ["Fisrt Half (Qty):Float:120", "Fisrt Half (Amt):Currency:120", "Second Half (Qty):Float:120", - "Second Half (Amt):Currency:120"] first_half_start = year_start_date first_half_end = add_days(add_months(first_half_start,6),-1) second_half_start = add_days(first_half_end,1) second_half_end = add_days(add_months(second_half_start,6),-1) + pwc = [get_mon(first_half_start)+"-"+get_mon(first_half_end)+"(Qty):Float:120", get_mon(first_half_start)+"-"+get_mon(first_half_end)+" (Amt):Currency:120", + get_mon(second_half_start)+"-"+get_mon(second_half_end)+" (Qty):Float:120", get_mon(second_half_start)+"-"+get_mon(second_half_end)+" (Amt):Currency:120"] + query_details = """ SUM(IF(t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s', t2.qty, NULL)), SUM(IF(t1.%(trans)s BETWEEN '%(fhs)s' AND '%(fhe)s', t1.grand_total, NULL)),