diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js index 13c0edc0a76..8e322abc4e8 100644 --- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js +++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.js @@ -23,21 +23,10 @@ frappe.query_reports["Item-wise Purchase Register"] = { "options": "Item", }, { - "fieldname":"account", - "label": __("Account"), + "fieldname":"supplier", + "label": __("Supplier"), "fieldtype": "Link", - "options": "Account", - "get_query": function() { - var company = frappe.query_report.filters_by_name.company.get_value(); - return { - "query": "erpnext.controllers.queries.get_account_list", - "filters": { - "report_type": "Balance Sheet", - "company": company, - "master_type": "Supplier" - } - } - } + "options": "Supplier" }, { "fieldname":"company", @@ -47,4 +36,4 @@ frappe.query_reports["Item-wise Purchase Register"] = { "default": frappe.defaults.get_user_default("company") } ] -} \ No newline at end of file +} diff --git a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py index 127e9cb61f7..9e66771e1c3 100644 --- a/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py +++ b/erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py @@ -10,42 +10,50 @@ def execute(filters=None): if not filters: filters = {} columns = get_columns() last_col = len(columns) - + item_list = get_items(filters) aii_account_map = get_aii_accounts() if item_list: item_tax, tax_accounts = get_tax_accounts(item_list, columns) - + data = [] for d in item_list: + purchase_receipt = None + if d.purchase_receipt: + purchase_receipt = d.purchase_receipt + elif d.po_detail: + purchase_receipt = ", ".join(frappe.db.sql_list("""select distinct parent + from `tabPurchase Receipt Item` where docstatus=1 and prevdoc_detail_docname=%s""", d.po_detail)) + expense_account = d.expense_account or aii_account_map.get(d.company) - row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, - d.supplier_name, d.credit_to, d.project_name, d.company, d.purchase_order, - d.purchase_receipt, expense_account, d.qty, d.base_rate, d.base_amount] + row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, d.supplier, + d.supplier_name, d.credit_to, d.project_name, d.company, d.purchase_order, + purchase_receipt, expense_account, d.qty, d.base_rate, d.base_amount] for tax in tax_accounts: row.append(item_tax.get(d.parent, {}).get(d.item_code, {}).get(tax, 0)) total_tax = sum(row[last_col:]) row += [total_tax, d.base_amount + total_tax] - + data.append(row) - + return columns, data - - + + def get_columns(): - return [_("Item Code") + ":Link/Item:120", _("Item Name") + "::120", _("Item Group") + ":Link/Item Group:100", - _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80", _("Supplier") + ":Link/Customer:120", - _("Supplier Account") + ":Link/Account:120", _("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100", - _("Purchase Order") + ":Link/Purchase Order:100", _("Purchase Receipt") + ":Link/Purchase Receipt:100", - _("Expense Account") + ":Link/Account:140", _("Qty") + ":Float:120", _("Rate") + ":Currency:120", - _("Amount") + ":Currency:120"] - + return [_("Item Code") + ":Link/Item:120", _("Item Name") + "::120", + _("Item Group") + ":Link/Item Group:100", _("Invoice") + ":Link/Purchase Invoice:120", + _("Posting Date") + ":Date:80", _("Supplier") + ":Link/Supplier:120", + "Supplier Name::120", "Payable Account:Link/Account:120", _("Project") + ":Link/Project:80", + _("Company") + ":Link/Company:100", _("Purchase Order") + ":Link/Purchase Order:100", + _("Purchase Receipt") + ":Link/Purchase Receipt:100", _("Expense Account") + ":Link/Account:140", + _("Qty") + ":Float:120", _("Rate") + ":Currency:120", _("Amount") + ":Currency:120"] + def get_conditions(filters): conditions = "" - + for opts in (("company", " and company=%(company)s"), - ("account", " and pi.credit_to = %(account)s"), + ("supplier", " and pi.supplier = %(supplier)s"), ("item_code", " and pi_item.item_code = %(item_code)s"), ("from_date", " and pi.posting_date>=%(from_date)s"), ("to_date", " and pi.posting_date<=%(to_date)s")): @@ -53,48 +61,48 @@ def get_conditions(filters): conditions += opts[1] return conditions - + def get_items(filters): conditions = get_conditions(filters) match_conditions = frappe.build_match_conditions("Purchase Invoice") - - return frappe.db.sql("""select pi_item.parent, pi.posting_date, pi.credit_to, pi.company, - pi.supplier, pi.remarks, pi_item.item_code, pi_item.item_name, pi_item.item_group, - pi_item.project_name, pi_item.purchase_order, pi_item.purchase_receipt, + + return frappe.db.sql("""select pi_item.parent, pi.posting_date, pi.credit_to, pi.company, + pi.supplier, pi.remarks, pi_item.item_code, pi_item.item_name, pi_item.item_group, + pi_item.project_name, pi_item.purchase_order, pi_item.purchase_receipt, pi_item.po_detail, pi_item.expense_account, pi_item.qty, pi_item.base_rate, pi_item.base_amount, pi.supplier_name - from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item + from `tabPurchase Invoice` pi, `tabPurchase Invoice Item` pi_item where pi.name = pi_item.parent and pi.docstatus = 1 %s %s order by pi.posting_date desc, pi_item.item_code desc""" % (conditions, match_conditions), filters, as_dict=1) - + def get_aii_accounts(): return dict(frappe.db.sql("select name, stock_received_but_not_billed from tabCompany")) - + def get_tax_accounts(item_list, columns): import json item_tax = {} tax_accounts = [] - + tax_details = frappe.db.sql("""select parent, account_head, item_wise_tax_detail - from `tabPurchase Taxes and Charges` where parenttype = 'Purchase Invoice' - and docstatus = 1 and ifnull(account_head, '') != '' and category in ('Total', 'Valuation and Total') + from `tabPurchase Taxes and Charges` where parenttype = 'Purchase Invoice' + and docstatus = 1 and ifnull(account_head, '') != '' and category in ('Total', 'Valuation and Total') and parent in (%s)""" % ', '.join(['%s']*len(item_list)), tuple([item.parent for item in item_list])) - + for parent, account_head, item_wise_tax_detail in tax_details: if account_head not in tax_accounts: tax_accounts.append(account_head) - + if item_wise_tax_detail: try: item_wise_tax_detail = json.loads(item_wise_tax_detail) for item, tax_amount in item_wise_tax_detail.items(): item_tax.setdefault(parent, {}).setdefault(item, {})[account_head] = \ flt(tax_amount[1]) if isinstance(tax_amount, list) else flt(tax_amount) - + except ValueError: continue - + tax_accounts.sort() columns += [account_head + ":Currency:80" for account_head in tax_accounts] columns += ["Total Tax:Currency:80", "Total:Currency:80"] - return item_tax, tax_accounts \ No newline at end of file + return item_tax, tax_accounts diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js index 79b1785dec8..88a6cdd4305 100644 --- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js +++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.js @@ -17,21 +17,10 @@ frappe.query_reports["Item-wise Sales Register"] = frappe.query_reports["Sales R "default": get_today() }, { - "fieldname":"account", - "label": __("Account"), + "fieldname":"customer", + "label": __("Customer"), "fieldtype": "Link", - "options": "Account", - "get_query": function() { - var company = frappe.query_report.filters_by_name.company.get_value(); - return { - "query": "erpnext.controllers.queries.get_account_list", - "filters": { - "report_type": "Balance Sheet", - "company": company, - "master_type": "Customer" - } - } - } + "options": "Customer" }, { "fieldname":"company", @@ -41,4 +30,4 @@ frappe.query_reports["Item-wise Sales Register"] = frappe.query_reports["Sales R "default": frappe.defaults.get_user_default("company") } ] -} \ No newline at end of file +} diff --git a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py index 2840291c705..48cb8e15965 100644 --- a/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py +++ b/erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py @@ -14,38 +14,48 @@ def execute(filters=None): item_list = get_items(filters) if item_list: item_tax, tax_accounts = get_tax_accounts(item_list, columns) - + data = [] for d in item_list: - row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, - d.customer_name, d.debit_to, d.territory, d.project_name, d.company, d.sales_order, - d.delivery_note, d.income_account, d.qty, d.base_rate, d.base_amount] - + delivery_note = None + if d.delivery_note: + delivery_note = d.delivery_note + elif d.so_detail: + delivery_note = ", ".join(frappe.db.sql_list("""select distinct parent + from `tabDelivery Note Item` where docstatus=1 and prevdoc_detail_docname=%s""", d.so_detail)) + + row = [d.item_code, d.item_name, d.item_group, d.parent, d.posting_date, d.customer, d.customer_name, + d.customer_group, d.debit_to, d.territory, d.project_name, d.company, d.sales_order, + delivery_note, d.income_account, d.qty, d.base_rate, d.base_amount] + for tax in tax_accounts: row.append(item_tax.get(d.parent, {}).get(d.item_code, {}).get(tax, 0)) total_tax = sum(row[last_col:]) row += [total_tax, d.base_amount + total_tax] - + data.append(row) - + return columns, data - + def get_columns(): return [ - _("Item Code") + ":Link/Item:120", _("Item Name") + "::120", _("Item Group") + ":Link/Item Group:100", - _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80", _("Customer") + ":Link/Customer:120", - _("Customer Account") + ":Link/Account:120", _("Territory") + ":Link/Territory:80", - _("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100", _("Sales Order") + ":Link/Sales Order:100", - _("Delivery Note") + ":Link/Delivery Note:100", _("Income Account") + ":Link/Account:140", - _("Qty") + ":Float:120", _("Rate") + ":Currency:120", _("Amount") + ":Currency:120" + _("Item Code") + ":Link/Item:120", _("Item Name") + "::120", + _("Item Group") + ":Link/Item Group:100", _("Invoice") + ":Link/Sales Invoice:120", + _("Posting Date") + ":Date:80", _("Customer") + ":Link/Customer:120", + _("Customer Name") + "::120", _("Customer Group") + ":Link/Customer Group:120", + _("Receivable Account") + ":Link/Account:120", _("Territory") + ":Link/Territory:80", + _("Project") + ":Link/Project:80", _("Company") + ":Link/Company:100", + _("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100", + _("Income Account") + ":Link/Account:140", _("Qty") + ":Float:120", + _("Rate") + ":Currency:120", _("Amount") + ":Currency:120" ] - + def get_conditions(filters): conditions = "" - + for opts in (("company", " and company=%(company)s"), - ("account", " and si.debit_to = %(account)s"), + ("customer", " and si.customer = %(customer)s"), ("item_code", " and si_item.item_code = %(item_code)s"), ("from_date", " and si.posting_date>=%(from_date)s"), ("to_date", " and si.posting_date<=%(to_date)s")): @@ -53,32 +63,33 @@ def get_conditions(filters): conditions += opts[1] return conditions - + def get_items(filters): conditions = get_conditions(filters) - return frappe.db.sql("""select si_item.parent, si.posting_date, si.debit_to, si.project_name, - si.customer, si.remarks, si.territory, si.company, si_item.item_code, si_item.item_name, - si_item.item_group, si_item.sales_order, si_item.delivery_note, si_item.income_account, - si_item.qty, si_item.base_rate, si_item.base_amount, si.customer_name - from `tabSales Invoice` si, `tabSales Invoice Item` si_item - where si.name = si_item.parent and si.docstatus = 1 %s + return frappe.db.sql("""select si_item.parent, si.posting_date, si.debit_to, si.project_name, + si.customer, si.remarks, si.territory, si.company, si_item.item_code, si_item.item_name, + si_item.item_group, si_item.sales_order, si_item.delivery_note, si_item.income_account, + si_item.qty, si_item.base_rate, si_item.base_amount, si.customer_name, + si.customer_group, si_item.so_detail + from `tabSales Invoice` si, `tabSales Invoice Item` si_item + where si.name = si_item.parent and si.docstatus = 1 %s order by si.posting_date desc, si_item.item_code desc""" % conditions, filters, as_dict=1) - + def get_tax_accounts(item_list, columns): import json item_tax = {} tax_accounts = [] - + tax_details = frappe.db.sql("""select parent, account_head, item_wise_tax_detail - from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice' + from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice' and docstatus = 1 and ifnull(account_head, '') != '' - and parent in (%s)""" % ', '.join(['%s']*len(item_list)), + and parent in (%s)""" % ', '.join(['%s']*len(item_list)), tuple([item.parent for item in item_list])) - + for parent, account_head, item_wise_tax_detail in tax_details: if account_head not in tax_accounts: tax_accounts.append(account_head) - + if item_wise_tax_detail: try: item_wise_tax_detail = json.loads(item_wise_tax_detail) @@ -87,9 +98,9 @@ def get_tax_accounts(item_list, columns): flt(tax_amount[1]) if isinstance(tax_amount, list) else flt(tax_amount) except ValueError: continue - + tax_accounts.sort() columns += [account_head + ":Currency:80" for account_head in tax_accounts] columns += ["Total Tax:Currency:80", "Total:Currency:80"] - return item_tax, tax_accounts \ No newline at end of file + return item_tax, tax_accounts diff --git a/erpnext/accounts/report/purchase_register/purchase_register.js b/erpnext/accounts/report/purchase_register/purchase_register.js index a1a41a5ee03..5497edbdef4 100644 --- a/erpnext/accounts/report/purchase_register/purchase_register.js +++ b/erpnext/accounts/report/purchase_register/purchase_register.js @@ -17,21 +17,10 @@ frappe.query_reports["Purchase Register"] = { "default": get_today() }, { - "fieldname":"account", - "label": __("Account"), + "fieldname":"supplier", + "label": __("Supplier"), "fieldtype": "Link", - "options": "Account", - "get_query": function() { - var company = frappe.query_report.filters_by_name.company.get_value(); - return { - "query": "erpnext.controllers.queries.get_account_list", - "filters": { - "report_type": "Balance Sheet", - "company": company, - "master_type": "Supplier" - } - } - } + "options": "Supplier" }, { "fieldname":"company", @@ -41,4 +30,4 @@ frappe.query_reports["Purchase Register"] = { "default": frappe.defaults.get_user_default("company") } ] -} \ No newline at end of file +} diff --git a/erpnext/accounts/report/purchase_register/purchase_register.py b/erpnext/accounts/report/purchase_register/purchase_register.py index 40006575c45..244a20cbfec 100644 --- a/erpnext/accounts/report/purchase_register/purchase_register.py +++ b/erpnext/accounts/report/purchase_register/purchase_register.py @@ -11,17 +11,17 @@ def execute(filters=None): invoice_list = get_invoices(filters) columns, expense_accounts, tax_accounts = get_columns(invoice_list) - - + + if not invoice_list: - msgprint(_("No record found")) + msgprint(_("No record found")) return columns, invoice_list - + invoice_expense_map = get_invoice_expense_map(invoice_list) - invoice_expense_map, invoice_tax_map = get_invoice_tax_map(invoice_list, + invoice_expense_map, invoice_tax_map = get_invoice_tax_map(invoice_list, invoice_expense_map, expense_accounts) invoice_po_pr_map = get_invoice_po_pr_map(invoice_list) - account_map = get_account_details(invoice_list) + supplier_details = get_supplier_deatils(invoice_list) data = [] for inv in invoice_list: @@ -30,20 +30,20 @@ def execute(filters=None): purchase_receipt = list(set(invoice_po_pr_map.get(inv.name, {}).get("purchase_receipt", []))) project_name = list(set(invoice_po_pr_map.get(inv.name, {}).get("project_name", []))) - row = [inv.name, inv.posting_date, inv.supplier, inv.supplier_name, inv.credit_to, - account_map.get(inv.credit_to), ", ".join(project_name), inv.bill_no, inv.bill_date, - inv.remarks, ", ".join(purchase_order), ", ".join(purchase_receipt)] - + row = [inv.name, inv.posting_date, inv.supplier, inv.supplier_name, supplier_details.get(inv.supplier), + inv.credit_to, ", ".join(project_name), inv.bill_no, inv.bill_date, inv.remarks, + ", ".join(purchase_order), ", ".join(purchase_receipt)] + # map expense values net_total = 0 for expense_acc in expense_accounts: expense_amount = flt(invoice_expense_map.get(inv.name, {}).get(expense_acc)) net_total += expense_amount row.append(expense_amount) - + # net total row.append(net_total or inv.net_total) - + # tax account total_tax = 0 for tax_acc in tax_accounts: @@ -56,82 +56,80 @@ def execute(filters=None): row += [total_tax, inv.grand_total, flt(inv.grand_total, 2), inv.outstanding_amount] data.append(row) # raise Exception - + return columns, data - - + + def get_columns(invoice_list): """return columns based on filters""" columns = [ - _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80", _("Supplier Id") + "::120", - _("Supplier Name") + "::120", _("Supplier Account") + ":Link/Account:120", - _("Account Group") + ":Link/Account:120", _("Project") + ":Link/Project:80", _("Bill No") + "::120", - _("Bill Date") + ":Date:80", _("Remarks") + "::150", + _("Invoice") + ":Link/Purchase Invoice:120", _("Posting Date") + ":Date:80", _("Supplier Id") + "::120", + _("Supplier Name") + "::120", _("Supplier Type") + ":Link/Supplier Type:120", _("Payable Account") + ":Link/Account:120", + _("Project") + ":Link/Project:80", _("Bill No") + "::120", _("Bill Date") + ":Date:80", _("Remarks") + "::150", _("Purchase Order") + ":Link/Purchase Order:100", _("Purchase Receipt") + ":Link/Purchase Receipt:100" ] expense_accounts = tax_accounts = expense_columns = tax_columns = [] - - if invoice_list: - expense_accounts = frappe.db.sql_list("""select distinct expense_account - from `tabPurchase Invoice Item` where docstatus = 1 and ifnull(expense_account, '') != '' - and parent in (%s) order by expense_account""" % + + if invoice_list: + expense_accounts = frappe.db.sql_list("""select distinct expense_account + from `tabPurchase Invoice Item` where docstatus = 1 and ifnull(expense_account, '') != '' + and parent in (%s) order by expense_account""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) - - tax_accounts = frappe.db.sql_list("""select distinct account_head - from `tabPurchase Taxes and Charges` where parenttype = 'Purchase Invoice' - and docstatus = 1 and ifnull(account_head, '') != '' and category in ('Total', 'Valuation and Total') - and parent in (%s) order by account_head""" % + + tax_accounts = frappe.db.sql_list("""select distinct account_head + from `tabPurchase Taxes and Charges` where parenttype = 'Purchase Invoice' + and docstatus = 1 and ifnull(account_head, '') != '' and category in ('Total', 'Valuation and Total') + and parent in (%s) order by account_head""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) - - + + expense_columns = [(account + ":Currency:120") for account in expense_accounts] for account in tax_accounts: if account not in expense_accounts: tax_columns.append(account + ":Currency:120") - - columns = columns + expense_columns + \ - ["Net Total:Currency:120"] + tax_columns + \ - ["Total Tax:Currency:120"] + ["Grand Total:Currency:120"] + \ - ["Rounded Total:Currency:120"] + ["Outstanding Amount:Currency:120"] + + columns = columns + expense_columns + [_("Net Total") + ":Currency:120"] + tax_columns + \ + [_("Total Tax") + ":Currency:120", _("Grand Total") + ":Currency:120", + _("Rounded Total") + ":Currency:120", _("Outstanding Amount") + ":Currency:120"] return columns, expense_accounts, tax_accounts def get_conditions(filters): conditions = "" - + if filters.get("company"): conditions += " and company=%(company)s" - if filters.get("account"): conditions += " and credit_to = %(account)s" + if filters.get("supplier"): conditions += " and supplier = %(supplier)s" if filters.get("from_date"): conditions += " and posting_date>=%(from_date)s" if filters.get("to_date"): conditions += " and posting_date<=%(to_date)s" return conditions - + def get_invoices(filters): conditions = get_conditions(filters) - return frappe.db.sql("""select name, posting_date, credit_to, supplier, supplier_name, - bill_no, bill_date, remarks, net_total, grand_total, outstanding_amount - from `tabPurchase Invoice` where docstatus = 1 %s + return frappe.db.sql("""select name, posting_date, credit_to, supplier, supplier_name + bill_no, bill_date, remarks, net_total, grand_total, outstanding_amount + 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 = frappe.db.sql("""select parent, expense_account, sum(base_amount) as amount - from `tabPurchase Invoice Item` where parent in (%s) group by parent, expense_account""" % + from `tabPurchase Invoice Item` where parent in (%s) group by parent, expense_account""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) - + invoice_expense_map = {} for d in expense_details: invoice_expense_map.setdefault(d.parent, frappe._dict()).setdefault(d.expense_account, []) invoice_expense_map[d.parent][d.expense_account] = flt(d.amount) - + return invoice_expense_map - + def get_invoice_tax_map(invoice_list, invoice_expense_map, expense_accounts): tax_details = frappe.db.sql("""select parent, account_head, sum(tax_amount) as tax_amount - from `tabPurchase Taxes and Charges` where parent in (%s) group by parent, account_head""" % + from `tabPurchase Taxes and Charges` where parent in (%s) group by parent, account_head""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) - + invoice_tax_map = {} for d in tax_details: if d.account_head in expense_accounts: @@ -142,34 +140,51 @@ def get_invoice_tax_map(invoice_list, invoice_expense_map, expense_accounts): else: invoice_tax_map.setdefault(d.parent, frappe._dict()).setdefault(d.account_head, []) invoice_tax_map[d.parent][d.account_head] = flt(d.tax_amount) - + return invoice_expense_map, invoice_tax_map - + def get_invoice_po_pr_map(invoice_list): - pi_items = frappe.db.sql("""select parent, purchase_order, purchase_receipt, - project_name from `tabPurchase Invoice Item` where parent in (%s) - and (ifnull(purchase_order, '') != '' or ifnull(purchase_receipt, '') != '')""" % + pi_items = frappe.db.sql("""select parent, purchase_order, purchase_receipt, po_detail + project_name from `tabPurchase Invoice Item` where parent in (%s) + and (ifnull(purchase_order, '') != '' or ifnull(purchase_receipt, '') != '')""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) - + invoice_po_pr_map = {} for d in pi_items: if d.purchase_order: invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault( "purchase_order", []).append(d.purchase_order) + + pr_list = None if d.purchase_receipt: - invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault( - "purchase_receipt", []).append(d.purchase_receipt) + pr_list = [d.purchase_receipt] + elif d.po_detail: + pr_list = frappe.db.sql_list("""select distinct parent from `tabPurchase Receipt Item` + where docstatus=1 and prevdoc_detail_docname=%s""", d.pr_detail) + + if pr_list: + invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault("purchase_receipt", pr_list) + if d.project_name: invoice_po_pr_map.setdefault(d.parent, frappe._dict()).setdefault( "project_name", []).append(d.project_name) - + return invoice_po_pr_map - + def get_account_details(invoice_list): account_map = {} accounts = list(set([inv.credit_to for inv in invoice_list])) - for acc in frappe.db.sql("""select name, parent_account from tabAccount + for acc in frappe.db.sql("""select name, parent_account from tabAccount where name in (%s)""" % ", ".join(["%s"]*len(accounts)), tuple(accounts), as_dict=1): account_map[acc.name] = acc.parent_account - - return account_map \ No newline at end of file + + return account_map + +def get_supplier_deatils(invoice_list): + supplier_details = {} + suppliers = list(set([inv.supplier for inv in invoice_list])) + for supp in frappe.db.sql("""select name, supplier_type from `tabSupplier` + where name in (%s)""" % ", ".join(["%s"]*len(suppliers)), tuple(suppliers), as_dict=1): + supplier_details.setdefault(supp.name, supp.supplier_type) + + return supplier_details diff --git a/erpnext/accounts/report/sales_register/sales_register.js b/erpnext/accounts/report/sales_register/sales_register.js index ac30562fd75..78a729fa093 100644 --- a/erpnext/accounts/report/sales_register/sales_register.js +++ b/erpnext/accounts/report/sales_register/sales_register.js @@ -17,21 +17,10 @@ frappe.query_reports["Sales Register"] = { "default": get_today() }, { - "fieldname":"account", - "label": __("Account"), + "fieldname":"customer", + "label": __("Customer"), "fieldtype": "Link", - "options": "Account", - "get_query": function() { - var company = frappe.query_report.filters_by_name.company.get_value(); - return { - "query": "erpnext.controllers.queries.get_account_list", - "filters": { - "report_type": "Balance Sheet", - "company": company, - "master_type": "Customer" - } - } - } + "options": "Customer" }, { "fieldname":"company", @@ -41,4 +30,4 @@ frappe.query_reports["Sales Register"] = { "default": frappe.defaults.get_user_default("company") } ] -} \ No newline at end of file +} diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py index 1bde11002df..01e7bad47fd 100644 --- a/erpnext/accounts/report/sales_register/sales_register.py +++ b/erpnext/accounts/report/sales_register/sales_register.py @@ -8,21 +8,20 @@ from frappe import msgprint, _ def execute(filters=None): if not filters: filters = {} - + invoice_list = get_invoices(filters) columns, income_accounts, tax_accounts = get_columns(invoice_list) - + if not invoice_list: msgprint(_("No record found")) return columns, invoice_list - + invoice_income_map = get_invoice_income_map(invoice_list) - invoice_income_map, invoice_tax_map = get_invoice_tax_map(invoice_list, + invoice_income_map, invoice_tax_map = get_invoice_tax_map(invoice_list, invoice_income_map, income_accounts) - + invoice_so_dn_map = get_invoice_so_dn_map(invoice_list) customer_map = get_customer_deatils(invoice_list) - account_map = get_account_details(invoice_list) data = [] for inv in invoice_list: @@ -30,20 +29,20 @@ def execute(filters=None): sales_order = list(set(invoice_so_dn_map.get(inv.name, {}).get("sales_order", []))) delivery_note = list(set(invoice_so_dn_map.get(inv.name, {}).get("delivery_note", []))) - row = [inv.name, inv.posting_date, inv.customer, inv.customer_name, inv.debit_to, - account_map.get(inv.debit_to), customer_map.get(inv.customer), inv.project_name, - inv.remarks, ", ".join(sales_order), ", ".join(delivery_note)] - + row = [inv.name, inv.posting_date, inv.customer, inv.customer_name, + customer_map.get(inv.customer)["customer_group"], customer_map.get(inv.customer)["territory"], + inv.debit_to, inv.project_name, inv.remarks, ", ".join(sales_order), ", ".join(delivery_note)] + # map income values net_total = 0 for income_acc in income_accounts: income_amount = flt(invoice_income_map.get(inv.name, {}).get(income_acc)) net_total += income_amount row.append(income_amount) - + # net total row.append(net_total or inv.net_total) - + # tax account total_tax = 0 for tax_acc in tax_accounts: @@ -56,81 +55,81 @@ def execute(filters=None): row += [total_tax, inv.grand_total, inv.rounded_total, inv.outstanding_amount] data.append(row) - + return columns, data - - + + def get_columns(invoice_list): """return columns based on filters""" columns = [ - _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80", _("Customer Id") + "::120", - _("Customer Name") + "::120", _("Customer Account") + ":Link/Account:120", _("Account Group") + ":Link/Account:120", - _("Territory") + ":Link/Territory:80", _("Project") + ":Link/Project:80", _("Remarks") + "::150", + _("Invoice") + ":Link/Sales Invoice:120", _("Posting Date") + ":Date:80", _("Customer Id") + "::120", + _("Customer Name") + "::120", _("Customer Group") + ":Link/Customer Group:120", _("Territory") + ":Link/Territory:80", + _("Receivable Account") + ":Link/Account:120", _("Project") +":Link/Project:80", _("Remarks") + "::150", _("Sales Order") + ":Link/Sales Order:100", _("Delivery Note") + ":Link/Delivery Note:100" ] - + income_accounts = tax_accounts = income_columns = tax_columns = [] - + if invoice_list: - income_accounts = frappe.db.sql_list("""select distinct income_account - from `tabSales Invoice Item` where docstatus = 1 and parent in (%s) - order by income_account""" % + income_accounts = frappe.db.sql_list("""select distinct income_account + from `tabSales Invoice Item` where docstatus = 1 and parent in (%s) + order by income_account""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) - - tax_accounts = frappe.db.sql_list("""select distinct account_head - from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice' - and docstatus = 1 and ifnull(tax_amount_after_discount_amount, 0) != 0 - and parent in (%s) order by account_head""" % + + tax_accounts = frappe.db.sql_list("""select distinct account_head + from `tabSales Taxes and Charges` where parenttype = 'Sales Invoice' + and docstatus = 1 and ifnull(tax_amount_after_discount_amount, 0) != 0 + and parent in (%s) order by account_head""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list])) income_columns = [(account + ":Currency:120") for account in income_accounts] for account in tax_accounts: if account not in income_accounts: tax_columns.append(account + ":Currency:120") - - columns = columns + income_columns + ["Net Total:Currency:120"] + tax_columns + \ - ["Total Tax:Currency:120"] + ["Grand Total:Currency:120"] + \ - ["Rounded Total:Currency:120"] + ["Outstanding Amount:Currency:120"] + + columns = columns + income_columns + [_("Net Total") + ":Currency:120"] + tax_columns + \ + [_("Total Tax") + ":Currency:120", _("Grand Total") + ":Currency:120", + _("Rounded Total") + ":Currency:120", _("Outstanding Amount") + ":Currency:120"] return columns, income_accounts, tax_accounts def get_conditions(filters): conditions = "" - + if filters.get("company"): conditions += " and company=%(company)s" - if filters.get("account"): conditions += " and debit_to = %(account)s" + if filters.get("customer"): conditions += " and customer = %(customer)s" if filters.get("from_date"): conditions += " and posting_date >= %(from_date)s" if filters.get("to_date"): conditions += " and posting_date <= %(to_date)s" return conditions - + def get_invoices(filters): conditions = get_conditions(filters) - return frappe.db.sql("""select name, posting_date, debit_to, project_name, customer, - customer_name, remarks, net_total, grand_total, rounded_total, outstanding_amount - from `tabSales Invoice` - where docstatus = 1 %s order by posting_date desc, name desc""" % + return frappe.db.sql("""select name, posting_date, debit_to, project_name, customer, + customer_name, remarks, net_total, grand_total, rounded_total, outstanding_amount + from `tabSales Invoice` + where docstatus = 1 %s order by posting_date desc, name desc""" % conditions, filters, as_dict=1) - + def get_invoice_income_map(invoice_list): income_details = frappe.db.sql("""select parent, income_account, sum(base_amount) as amount - from `tabSales Invoice Item` where parent in (%s) group by parent, income_account""" % + from `tabSales Invoice Item` where parent in (%s) group by parent, income_account""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) - + invoice_income_map = {} for d in income_details: invoice_income_map.setdefault(d.parent, frappe._dict()).setdefault(d.income_account, []) invoice_income_map[d.parent][d.income_account] = flt(d.amount) - + return invoice_income_map - + def get_invoice_tax_map(invoice_list, invoice_income_map, income_accounts): - tax_details = frappe.db.sql("""select parent, account_head, - sum(tax_amount_after_discount_amount) as tax_amount - from `tabSales Taxes and Charges` where parent in (%s) group by parent, account_head""" % + tax_details = frappe.db.sql("""select parent, account_head, + sum(tax_amount_after_discount_amount) as tax_amount + from `tabSales Taxes and Charges` where parent in (%s) group by parent, account_head""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) - + invoice_tax_map = {} for d in tax_details: if d.account_head in income_accounts: @@ -141,40 +140,38 @@ def get_invoice_tax_map(invoice_list, invoice_income_map, income_accounts): else: invoice_tax_map.setdefault(d.parent, frappe._dict()).setdefault(d.account_head, []) invoice_tax_map[d.parent][d.account_head] = flt(d.tax_amount) - + return invoice_income_map, invoice_tax_map - + def get_invoice_so_dn_map(invoice_list): - si_items = frappe.db.sql("""select parent, sales_order, delivery_note - from `tabSales Invoice Item` where parent in (%s) - and (ifnull(sales_order, '') != '' or ifnull(delivery_note, '') != '')""" % + si_items = frappe.db.sql("""select parent, sales_order, delivery_note, so_detail + from `tabSales Invoice Item` where parent in (%s) + and (ifnull(sales_order, '') != '' or ifnull(delivery_note, '') != '')""" % ', '.join(['%s']*len(invoice_list)), tuple([inv.name for inv in invoice_list]), as_dict=1) - + invoice_so_dn_map = {} for d in si_items: if d.sales_order: invoice_so_dn_map.setdefault(d.parent, frappe._dict()).setdefault( "sales_order", []).append(d.sales_order) + + delivery_note_list = None if d.delivery_note: - invoice_so_dn_map.setdefault(d.parent, frappe._dict()).setdefault( - "delivery_note", []).append(d.delivery_note) - + delivery_note_list = [d.delivery_note] + elif d.sales_order: + delivery_note_list = frappe.db.sql_list("""select distinct parent from `tabDelivery Note Item` + where docstatus=1 and prevdoc_detail_docname=%s""", d.so_detail) + + if delivery_note_list: + invoice_so_dn_map.setdefault(d.parent, frappe._dict()).setdefault("delivery_note", delivery_note_list) + return invoice_so_dn_map - + def get_customer_deatils(invoice_list): customer_map = {} customers = list(set([inv.customer for inv in invoice_list])) - for cust in frappe.db.sql("""select name, territory from `tabCustomer` + for cust in frappe.db.sql("""select name, territory, customer_group from `tabCustomer` where name in (%s)""" % ", ".join(["%s"]*len(customers)), tuple(customers), as_dict=1): - customer_map[cust.name] = cust.territory - + customer_map.setdefault(cust.name, cust) + return customer_map - -def get_account_details(invoice_list): - account_map = {} - accounts = list(set([inv.debit_to for inv in invoice_list])) - for acc in frappe.db.sql("""select name, parent_account from tabAccount - where name in (%s)""" % ", ".join(["%s"]*len(accounts)), tuple(accounts), as_dict=1): - account_map[acc.name] = acc.parent_account - - return account_map \ No newline at end of file