From f805a76e792ca27392db5695b8ccd7902a6c02cc Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 13 Nov 2019 17:27:16 +0530 Subject: [PATCH 01/43] chore: pinned requirements --- requirements.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/requirements.txt b/requirements.txt index 28ba9f676ff..429f894edce 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ frappe -unidecode -pygithub -googlemaps -python-stdnum -braintree -gocardless_pro -woocommerce -pandas -plaid-python \ No newline at end of file +Unidecode==1.1.1 +PyGithub==1.43.8 +googlemaps==3.1.1 +python-stdnum==1.11 +braintree==3.57.1 +gocardless-pro==1.10.0 +WooCommerce==2.1.1 +pandas==0.25.1 +plaid-python==3.4.0 From 3798f8bd25d6ac02c7d09da61e45db8c9a5c51e4 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 15 Nov 2019 13:59:15 +0530 Subject: [PATCH 02/43] style(requirements): alphabetically sorted requirements --- requirements.txt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index 429f894edce..1ab84ad57b5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ -frappe -Unidecode==1.1.1 -PyGithub==1.43.8 -googlemaps==3.1.1 -python-stdnum==1.11 braintree==3.57.1 +frappe gocardless-pro==1.10.0 -WooCommerce==2.1.1 +googlemaps==3.1.1 pandas==0.25.1 plaid-python==3.4.0 +PyGithub==1.43.8 +python-stdnum==1.11 +Unidecode==1.1.1 +WooCommerce==2.1.1 From 73089470b18f2a04a28b3ba3391b1605e12becf4 Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Fri, 15 Nov 2019 17:38:32 +0530 Subject: [PATCH 03/43] chore: pinned backwards compatible dependencies --- requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 1ab84ad57b5..c277545fab5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,10 @@ braintree==3.57.1 frappe -gocardless-pro==1.10.0 +gocardless-pro==1.11.0 googlemaps==3.1.1 -pandas==0.25.1 +pandas==0.24.2 plaid-python==3.4.0 -PyGithub==1.43.8 -python-stdnum==1.11 +PyGithub==1.44.1 +python-stdnum==1.12 Unidecode==1.1.1 WooCommerce==2.1.1 From e5a572a4a8c914a601c8fde3273a57b48cd74276 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Mon, 6 Jan 2020 12:34:53 +0530 Subject: [PATCH 04/43] fix: Group by sales register report --- .../item_wise_sales_register.js | 35 +- .../item_wise_sales_register.py | 335 ++++++++++++++++-- .../report/sales_register/sales_register.py | 4 +- 3 files changed, 330 insertions(+), 44 deletions(-) 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 9dd9b3fad48..cff51cb8d64 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 @@ -4,48 +4,67 @@ frappe.query_reports["Item-wise Sales Register"] = { "filters": [ { - "fieldname":"date_range", + "fieldname": "date_range", "label": __("Date Range"), "fieldtype": "DateRange", "default": [frappe.datetime.add_months(frappe.datetime.get_today(),-1), frappe.datetime.get_today()], "reqd": 1 }, { - "fieldname":"customer", + "fieldname": "customer", "label": __("Customer"), "fieldtype": "Link", "options": "Customer" }, { - "fieldname":"company", + "fieldname": "company", "label": __("Company"), "fieldtype": "Link", "options": "Company", "default": frappe.defaults.get_user_default("Company") }, { - "fieldname":"mode_of_payment", + "fieldname": "mode_of_payment", "label": __("Mode of Payment"), "fieldtype": "Link", "options": "Mode of Payment" }, { - "fieldname":"warehouse", + "fieldname": "warehouse", "label": __("Warehouse"), "fieldtype": "Link", "options": "Warehouse" }, { - "fieldname":"brand", + "fieldname": "brand", "label": __("Brand"), "fieldtype": "Link", "options": "Brand" }, { - "fieldname":"item_group", + "fieldname": "item_group", "label": __("Item Group"), "fieldtype": "Link", "options": "Item Group" + }, + { + "label": __("Group By"), + "fieldname": "group_by", + "fieldtype": "Select", + "options": ["Customer", "Item", "Item Group", "Invoice"] } - ] + ], + "formatter": function(value, row, column, data, default_formatter) { + value = default_formatter(value, row, column, data); + + if (data && data.bold) { + // value = $(`${value}`); + // var $value = $(value).css("font-weight", "bold"); + // $value.addClass("text-danger"); + value = value.bold(); + + } + + return value; + }, } 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 9da89ff2c9f..af6a7b4d62c 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 @@ -15,23 +15,31 @@ def execute(filters=None): def _execute(filters=None, additional_table_columns=None, additional_query_columns=None): if not filters: filters = {} filters.update({"from_date": filters.get("date_range") and filters.get("date_range")[0], "to_date": filters.get("date_range") and filters.get("date_range")[1]}) - columns = get_columns(additional_table_columns) + columns = get_columns(additional_table_columns, filters) company_currency = frappe.get_cached_value('Company', filters.get("company"), "default_currency") item_list = get_items(filters, additional_query_columns) if item_list: itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency) + columns.append({ - "fieldname": "currency", - "label": _("Currency"), - "fieldtype": "Data", - "width": 80 + 'fieldname': 'currency', + 'label': _('Currency'), + 'fieldtype': 'Currency', + 'width': 80, + 'hidden': 1 }) + mode_of_payments = get_mode_of_payments(set([d.parent for d in item_list])) so_dn_map = get_delivery_notes_against_sales_order(item_list) + if filters.get('group_by'): + grand_total = get_grand_total(filters) + data = [] + prev_group_by_value = '' + for d in item_list: delivery_note = None if d.delivery_note: @@ -42,57 +50,271 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum if not delivery_note and d.update_stock: delivery_note = d.parent - row = [d.item_code, d.item_name, d.item_group, d.description, d.parent, d.posting_date, d.customer, d.customer_name] + + if filters.get('group_by'): + if filters.get('group_by') == 'Item': + group_by_field = 'item_code' + elif filters.get('group_by') == 'Invoice': + group_by_field = 'parent' + else: + group_by_field = frappe.scrub(filters.get('group_by')) + + if prev_group_by_value != d.get(group_by_field): + if prev_group_by_value: + total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) + data.append(total_row) + data.append({}) + + prev_group_by_value = d.get(group_by_field) + + total_row = { + group_by_field: d.get(group_by_field), + 'stock_qty': 0.0, + 'amount': 0.0, + 'bold': 1, + 'total_tax': 0.0, + 'total': 0.0 + } + + row = { + 'item_code': d.item_code, + 'item_name': d.item_name, + 'item_group': d.item_group, + 'description': d.description, + 'invoice': d.parent, + 'posting_date': d.posting_date, + 'customer': d.customer, + 'customer_name': d.customer_name + } if additional_query_columns: for col in additional_query_columns: - row.append(d.get(col)) + row.update({ + col: d.get(col) + }) - row += [ - d.customer_group, d.debit_to, ", ".join(mode_of_payments.get(d.parent, [])), - d.territory, d.project, d.company, d.sales_order, - delivery_note, d.income_account, d.cost_center, d.stock_qty, d.stock_uom - ] + row.update({ + 'customer_group': d.customer_group, + 'debit_to': d.debit_to, + 'mode_of_payment': ", ".join(mode_of_payments.get(d.parent, [])), + 'territory': d.territory, + 'project': d.project, + 'company': d.company, + 'sales_order': d.sales_order, + 'delivery_note': d.delivery_note, + 'income_account': d.income_account, + 'cost_center': d.cost_center, + 'stock_qty': d.stock_qty, + 'stock_uom': d.stock_uom + }) if d.stock_uom != d.uom and d.stock_qty: - row += [(d.base_net_rate * d.qty)/d.stock_qty, d.base_net_amount] + row.update({ + 'rate': (d.base_net_rate * d.qty)/d.stock_qty, + 'amount': d.base_net_amount + }) else: - row += [d.base_net_rate, d.base_net_amount] + row.update({ + 'rate': d.base_net_rate, + 'amount': d.base_net_amount + }) total_tax = 0 for tax in tax_columns: item_tax = itemised_tax.get(d.name, {}).get(tax, {}) - row += [item_tax.get("tax_rate", 0), item_tax.get("tax_amount", 0)] + row.update({ + frappe.scrub(tax + ' Rate'): item_tax.get("tax_rate", 0), + frappe.scrub(tax + ' Amount'): item_tax.get("tax_amount", 0), + }) total_tax += flt(item_tax.get("tax_amount")) - row += [total_tax, d.base_net_amount + total_tax, company_currency] + row.update({ + 'total_tax': total_tax, + 'total': d.base_net_amount + total_tax, + 'currency': company_currency + }) + + if filters.get('group_by'): + total_row['stock_qty'] += row['stock_qty'] + total_row['amount'] += row['amount'] + total_row['total_tax'] += row['total_tax'] + total_row['total'] += row['total'] data.append(row) + if filters.get('group_by'): + total_row['percent_gt'] = frappe.bold(total_row['total']/grand_total * 100) + data.append(total_row) + data.append({}) + return columns, data -def get_columns(additional_table_columns): +def get_columns(additional_table_columns, filters): columns = [ - _("Item Code") + ":Link/Item:120", _("Item Name") + "::120", - _("Item Group") + ":Link/Item Group:100", "Description::150", _("Invoice") + ":Link/Sales Invoice:120", - _("Posting Date") + ":Date:80", _("Customer") + ":Link/Customer:120", - _("Customer Name") + "::120"] + { + 'label': _('Item Code'), + 'fieldname': 'item_code', + 'fieldtype': 'Link', + 'options': 'Item', + 'width': 120 + }, + { + 'label': _('Item Name'), + 'fieldname': 'item_name', + 'fieldtype': 'Data', + 'width': 120 + }, + { + 'label': _('Item Group'), + 'fieldname': 'item_group', + 'fieldtype': 'Link', + 'options': 'Item Group', + 'width': 120 + }, + { + 'label': _('Description'), + 'fieldname': 'description', + 'fieldtype': 'Data', + 'width': 150 + }, + { + 'label': _('Invoice'), + 'fieldname': 'invoice', + 'fieldtype': 'Link', + 'options': 'Sales Invoice', + 'width': 120 + }, + { + 'label': _('Posting Date'), + 'fieldname': 'posting_date', + 'fieldtype': 'Date', + 'width': 120 + }, + { + 'label': _('Customer'), + 'fieldname': 'customer', + 'fieldtype': 'Link', + 'options': 'Customer', + 'width': 120 + }, + { + 'label': _('Customer Name'), + 'fieldname': 'customer_name', + 'fieldtype': 'Data', + 'width': 120 + } + ] if additional_table_columns: columns += additional_table_columns columns += [ - _("Customer Group") + ":Link/Customer Group:120", - _("Receivable Account") + ":Link/Account:120", - _("Mode of Payment") + "::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", _("Cost Center") + ":Link/Cost Center:140", - _("Stock Qty") + ":Float:120", _("Stock UOM") + "::100", - _("Rate") + ":Currency/currency:120", - _("Amount") + ":Currency/currency:120" + { + 'label': _('Customer Group'), + 'fieldname': 'customer_group', + 'fieldtype': 'Link', + 'options': 'Customer Group', + 'width': 120 + }, + { + 'label': _('Receivable Account'), + 'fieldname': 'debit_to', + 'fieldtype': 'Link', + 'options': 'Account', + 'width': 80 + }, + { + 'label': _('Mode Of Payment'), + 'fieldname': 'mode_of_payment', + 'fieldtype': 'Data', + 'width': 120 + }, + { + 'label': _("Territory"), + 'fieldname': 'territory', + 'fieldtype': 'Link', + 'options': 'Territory', + 'width': 80 + }, + { + 'label': _('Project'), + 'fieldname': 'project', + 'fieldtype': 'Link', + 'options': 'Project', + 'width': 80 + }, + { + 'label': _('Company'), + 'fieldname': 'company', + 'fieldtype': 'Link', + 'options': 'Company', + 'width': 80 + }, + { + 'label': _('Sales Order'), + 'fieldname': 'sales_order', + 'fieldtype': 'Link', + 'options': 'Sales Order', + 'width': 100 + }, + { + 'label': _("Delivery Note"), + 'fieldname': 'delivery_note', + 'fieldtype': 'Link', + 'options': 'Delivery Note', + 'width': 100 + }, + { + 'label': _('Income Account'), + 'fieldname': 'income_account', + 'fieldtype': 'Link', + 'options': 'Account', + 'width': 100 + }, + { + 'label': _("Cost Center"), + 'fieldname': 'cost_center', + 'fieldtype': 'Link', + 'options': 'Cost Center', + 'width': 100 + }, + { + 'label': _('Stock Qty'), + 'fieldname': 'stock_qty', + 'fieldtype': 'Float', + 'width': 100 + }, + { + 'label': _('Stock UOM'), + 'fieldname': 'stock_uom', + 'fieldtype': 'Link', + 'options': 'UOM', + 'width': 100 + }, + { + 'label': _('Rate'), + 'fieldname': 'rate', + 'fieldtype': 'Float', + 'options': 'currency', + 'width': 100 + }, + { + 'label': _('Amount'), + 'fieldname': 'amount', + 'fieldtype': 'Currency', + 'options': 'currency', + 'width': 100 + } ] + if filters.get('group_by'): + columns.append({ + 'label': _('% Of Grand Total'), + 'fieldname': 'percent_gt', + 'fieldtype': 'Float', + 'width': 80 + }) + return columns def get_conditions(filters): @@ -127,6 +349,16 @@ def get_conditions(filters): where parent=`tabSales Invoice`.name and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s)""" + if not filters.get("group_by"): + conditions += "ORDER BY `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_code desc" + + if filters.get("group_by"): + if filters.get("group_by") == 'Invoice': + conditions += " ORDER BY `tabSales Invoice Item`.parent desc" + elif filters.get("group_by") == 'Item': + conditions += " ORDER BY `tabSales Invoice Item`.item_code desc" + else: + conditions += " ORDER BY {0}".format(frappe.scrub(filters.get("group_by"))) return conditions @@ -157,7 +389,6 @@ def get_items(filters, additional_query_columns): from `tabSales Invoice`, `tabSales Invoice Item` where `tabSales Invoice`.name = `tabSales Invoice Item`.parent and `tabSales Invoice`.docstatus = 1 %s %s - order by `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_code desc """.format(additional_query_columns or '') % (conditions, match_conditions), filters, as_dict=1) def get_delivery_notes_against_sales_order(item_list): @@ -177,6 +408,15 @@ def get_delivery_notes_against_sales_order(item_list): return so_dn_map +def get_grand_total(filters): + conditions = get_conditions(filters) + + return frappe.db.sql(""" SELECT + SUM(`tabSales Invoice`.grand_total) + FROM `tabSales Invoice` + WHERE `tabSales Invoice`.docstatus = 1 %s + """ % (conditions), filters)[0][0] + def get_deducted_taxes(): return frappe.db.sql_list("select name from `tabPurchase Taxes and Charges` where add_deduct_tax = 'Deduct'") @@ -264,9 +504,36 @@ def get_tax_accounts(item_list, columns, company_currency, tax_columns.sort() for desc in tax_columns: - columns.append(desc + " Rate:Data:80") - columns.append(desc + " Amount:Currency/currency:100") + columns.append({ + 'label': _(desc + ' Rate'), + 'fieldname': frappe.scrub(desc + ' Rate'), + 'fieldtype': 'Float', + 'width': 100 + }) - columns += ["Total Tax:Currency/currency:80", "Total:Currency/currency:100"] + columns.append({ + 'label': _(desc + ' Amount'), + 'fieldname': frappe.scrub(desc + ' Amount'), + 'fieldtype': 'Currency', + 'options': 'currency', + 'width': 100 + }) + + columns += [ + { + 'label': _('Total Tax'), + 'fieldname': 'total_tax', + 'fieldtype': 'Currency', + 'options': 'currency', + 'width': 100 + }, + { + 'label': _('Total'), + 'fieldname': 'total', + 'fieldtype': 'Currency', + 'options': 'currency', + 'width': 100 + } + ] return itemised_tax, tax_columns diff --git a/erpnext/accounts/report/sales_register/sales_register.py b/erpnext/accounts/report/sales_register/sales_register.py index afdd31df16d..2be90bc5264 100644 --- a/erpnext/accounts/report/sales_register/sales_register.py +++ b/erpnext/accounts/report/sales_register/sales_register.py @@ -139,7 +139,7 @@ def get_columns(invoice_list, additional_table_columns): columns +=[ { - 'label': _("Custmer Group"), + 'label': _("Customer Group"), 'fieldname': 'customer_group', 'fieldtype': 'Link', 'options': 'Customer Group', @@ -175,7 +175,7 @@ def get_columns(invoice_list, additional_table_columns): 'label': _("Project"), 'fieldname': 'project', 'fieldtype': 'Link', - 'options': 'project', + 'options': 'Project', 'width': 80 }, { From 30111e640343f1bf16fafb1ec0257f9e6df773de Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Thu, 9 Jan 2020 08:41:09 +0530 Subject: [PATCH 05/43] fix: Remove group-by item --- .../item_wise_sales_register/item_wise_sales_register.js | 5 +---- .../item_wise_sales_register/item_wise_sales_register.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) 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 cff51cb8d64..1303cb93fce 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 @@ -51,16 +51,13 @@ frappe.query_reports["Item-wise Sales Register"] = { "label": __("Group By"), "fieldname": "group_by", "fieldtype": "Select", - "options": ["Customer", "Item", "Item Group", "Invoice"] + "options": ["Customer", "Item Group", "Invoice"] } ], "formatter": function(value, row, column, data, default_formatter) { value = default_formatter(value, row, column, data); if (data && data.bold) { - // value = $(`${value}`); - // var $value = $(value).css("font-weight", "bold"); - // $value.addClass("text-danger"); value = value.bold(); } 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 af6a7b4d62c..43562976bbb 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 @@ -68,7 +68,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum prev_group_by_value = d.get(group_by_field) total_row = { - group_by_field: d.get(group_by_field), + 'item_code': d.get(group_by_field), 'stock_qty': 0.0, 'amount': 0.0, 'bold': 1, From ea5e0a9d5bfb55dd98214b0bb5e2452ad744705d Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Sat, 11 Jan 2020 16:37:46 +0530 Subject: [PATCH 06/43] fix: Grand total query fix --- .../item_wise_sales_register.js | 2 +- .../item_wise_sales_register.py | 25 +++++++++++-------- 2 files changed, 16 insertions(+), 11 deletions(-) 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 1303cb93fce..765d761fc4c 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 @@ -51,7 +51,7 @@ frappe.query_reports["Item-wise Sales Register"] = { "label": __("Group By"), "fieldname": "group_by", "fieldtype": "Select", - "options": ["Customer", "Item Group", "Invoice"] + "options": ["Customer", "Item Group", "Item", "Invoice"] } ], "formatter": function(value, row, column, data, default_formatter) { 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 43562976bbb..1c786936901 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 @@ -54,10 +54,13 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum if filters.get('group_by'): if filters.get('group_by') == 'Item': group_by_field = 'item_code' + subtotal_display_field = 'customer' elif filters.get('group_by') == 'Invoice': group_by_field = 'parent' + subtotal_display_field = 'item_code' else: group_by_field = frappe.scrub(filters.get('group_by')) + subtotal_display_field = 'item_code' if prev_group_by_value != d.get(group_by_field): if prev_group_by_value: @@ -68,7 +71,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum prev_group_by_value = d.get(group_by_field) total_row = { - 'item_code': d.get(group_by_field), + subtotal_display_field: d.get(group_by_field), 'stock_qty': 0.0, 'amount': 0.0, 'bold': 1, @@ -350,15 +353,17 @@ def get_conditions(filters): and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s)""" if not filters.get("group_by"): - conditions += "ORDER BY `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_code desc" + conditions += "ORDER BY `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_group desc" if filters.get("group_by"): if filters.get("group_by") == 'Invoice': conditions += " ORDER BY `tabSales Invoice Item`.parent desc" elif filters.get("group_by") == 'Item': - conditions += " ORDER BY `tabSales Invoice Item`.item_code desc" - else: - conditions += " ORDER BY {0}".format(frappe.scrub(filters.get("group_by"))) + conditions += " ORDER BY `tabSales Invoice Item`.item_code" + elif filters.get("group_by") == 'Item Group': + conditions += " ORDER BY `tabSales Invoice Item`.`item_group`" + elif filters.get("group_by") == 'Customer': + conditions += " ORDER BY `tabSales Invoice`.customer" return conditions @@ -388,8 +393,8 @@ def get_items(filters, additional_query_columns): `tabSales Invoice`.update_stock, `tabSales Invoice Item`.uom, `tabSales Invoice Item`.qty {0} from `tabSales Invoice`, `tabSales Invoice Item` where `tabSales Invoice`.name = `tabSales Invoice Item`.parent - and `tabSales Invoice`.docstatus = 1 %s %s - """.format(additional_query_columns or '') % (conditions, match_conditions), filters, as_dict=1) + and `tabSales Invoice`.docstatus = 1 {1} {2} + """.format(additional_query_columns or '', conditions, match_conditions), filters, as_dict=1, debug=1) def get_delivery_notes_against_sales_order(item_list): so_dn_map = frappe._dict() @@ -409,13 +414,13 @@ def get_delivery_notes_against_sales_order(item_list): return so_dn_map def get_grand_total(filters): - conditions = get_conditions(filters) return frappe.db.sql(""" SELECT SUM(`tabSales Invoice`.grand_total) FROM `tabSales Invoice` - WHERE `tabSales Invoice`.docstatus = 1 %s - """ % (conditions), filters)[0][0] + WHERE `tabSales Invoice`.docstatus = 1 + and posting_date between %s and %s + """, (filters.get('from_date'), filters.get('to_date')))[0][0] def get_deducted_taxes(): return frappe.db.sql_list("select name from `tabPurchase Taxes and Charges` where add_deduct_tax = 'Deduct'") From 4dfe8ab483a5be4183d7ef0251e5634a91fec53d Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Sun, 12 Jan 2020 22:14:45 +0530 Subject: [PATCH 07/43] fix: Remove debug param --- .../report/item_wise_sales_register/item_wise_sales_register.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 1c786936901..65a4b24a595 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 @@ -394,7 +394,7 @@ def get_items(filters, additional_query_columns): from `tabSales Invoice`, `tabSales Invoice Item` where `tabSales Invoice`.name = `tabSales Invoice Item`.parent and `tabSales Invoice`.docstatus = 1 {1} {2} - """.format(additional_query_columns or '', conditions, match_conditions), filters, as_dict=1, debug=1) + """.format(additional_query_columns or '', conditions, match_conditions), filters, as_dict=1) #nosec def get_delivery_notes_against_sales_order(item_list): so_dn_map = frappe._dict() From 8d9145aaac9e278b9c1e641180c55220b5aabde1 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Mon, 27 Jan 2020 08:48:04 +0530 Subject: [PATCH 08/43] fix: Code cleanup and commonification --- .../item_wise_sales_register.js | 6 +- .../item_wise_sales_register.py | 298 +++++++++++------- 2 files changed, 182 insertions(+), 122 deletions(-) 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 765d761fc4c..8a9c76f26f8 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 @@ -51,17 +51,15 @@ frappe.query_reports["Item-wise Sales Register"] = { "label": __("Group By"), "fieldname": "group_by", "fieldtype": "Select", - "options": ["Customer", "Item Group", "Item", "Invoice"] + "options": ["Customer Group", "Customer", "Item Group", "Item", "Territory", "Invoice"] } ], "formatter": function(value, row, column, data, default_formatter) { value = default_formatter(value, row, column, data); - if (data && data.bold) { value = value.bold(); } - return value; - }, + } } 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 65a4b24a595..57a99ef76a9 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 @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe, erpnext from frappe import _ -from frappe.utils import flt +from frappe.utils import flt, cstr from frappe.model.meta import get_field_precision from frappe.utils.xlsxutils import handle_html from erpnext.accounts.report.sales_register.sales_register import get_mode_of_payments @@ -23,23 +23,16 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum if item_list: itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency) - columns.append({ - 'fieldname': 'currency', - 'label': _('Currency'), - 'fieldtype': 'Currency', - 'width': 80, - 'hidden': 1 - }) - mode_of_payments = get_mode_of_payments(set([d.parent for d in item_list])) so_dn_map = get_delivery_notes_against_sales_order(item_list) - if filters.get('group_by'): - grand_total = get_grand_total(filters) - data = [] + total_row_map = {} prev_group_by_value = '' + if filters.get('group_by'): + grand_total = get_grand_total(filters, 'Sales Invoice') + for d in item_list: delivery_note = None if d.delivery_note: @@ -50,35 +43,6 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum if not delivery_note and d.update_stock: delivery_note = d.parent - - if filters.get('group_by'): - if filters.get('group_by') == 'Item': - group_by_field = 'item_code' - subtotal_display_field = 'customer' - elif filters.get('group_by') == 'Invoice': - group_by_field = 'parent' - subtotal_display_field = 'item_code' - else: - group_by_field = frappe.scrub(filters.get('group_by')) - subtotal_display_field = 'item_code' - - if prev_group_by_value != d.get(group_by_field): - if prev_group_by_value: - total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) - data.append(total_row) - data.append({}) - - prev_group_by_value = d.get(group_by_field) - - total_row = { - subtotal_display_field: d.get(group_by_field), - 'stock_qty': 0.0, - 'amount': 0.0, - 'bold': 1, - 'total_tax': 0.0, - 'total': 0.0 - } - row = { 'item_code': d.item_code, 'item_name': d.item_name, @@ -87,7 +51,8 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum 'invoice': d.parent, 'posting_date': d.posting_date, 'customer': d.customer, - 'customer_name': d.customer_name + 'customer_name': d.customer_name, + 'customer_group': d.customer_group, } if additional_query_columns: @@ -97,7 +62,6 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum }) row.update({ - 'customer_group': d.customer_group, 'debit_to': d.debit_to, 'mode_of_payment': ", ".join(mode_of_payments.get(d.parent, [])), 'territory': d.territory, @@ -138,42 +102,56 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum }) if filters.get('group_by'): - total_row['stock_qty'] += row['stock_qty'] - total_row['amount'] += row['amount'] - total_row['total_tax'] += row['total_tax'] - total_row['total'] += row['total'] + row.update({'percent_gt': flt(row['total']/grand_total) * 100}) + group_by_field, subtotal_display_field = get_group_by_and_display_fields(filters) + data, prev_group_by_value = add_total_row(data, filters, prev_group_by_value, d, total_row_map, + group_by_field, subtotal_display_field, grand_total) + update_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns) data.append(row) if filters.get('group_by'): - total_row['percent_gt'] = frappe.bold(total_row['total']/grand_total * 100) + total_row = total_row_map.get(prev_group_by_value or d.get('item_name')) + total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) data.append(total_row) data.append({}) return columns, data def get_columns(additional_table_columns, filters): - columns = [ - { - 'label': _('Item Code'), - 'fieldname': 'item_code', - 'fieldtype': 'Link', - 'options': 'Item', - 'width': 120 - }, - { - 'label': _('Item Name'), - 'fieldname': 'item_name', - 'fieldtype': 'Data', - 'width': 120 - }, - { - 'label': _('Item Group'), - 'fieldname': 'item_group', - 'fieldtype': 'Link', - 'options': 'Item Group', - 'width': 120 - }, + columns = [] + + if filters.get('group_by') != ('Item'): + columns.extend( + [ + { + 'label': _('Item Code'), + 'fieldname': 'item_code', + 'fieldtype': 'Link', + 'options': 'Item', + 'width': 120 + }, + { + 'label': _('Item Name'), + 'fieldname': 'item_name', + 'fieldtype': 'Data', + 'width': 120 + } + ] + ) + + if filters.get('group_by') not in ('Item', 'Item Group'): + columns.extend([ + { + 'label': _('Item Group'), + 'fieldname': 'item_group', + 'fieldtype': 'Link', + 'options': 'Item Group', + 'width': 120 + } + ]) + + columns.extend([ { 'label': _('Description'), 'fieldname': 'description', @@ -192,33 +170,41 @@ def get_columns(additional_table_columns, filters): 'fieldname': 'posting_date', 'fieldtype': 'Date', 'width': 120 - }, - { - 'label': _('Customer'), - 'fieldname': 'customer', - 'fieldtype': 'Link', - 'options': 'Customer', - 'width': 120 - }, - { - 'label': _('Customer Name'), - 'fieldname': 'customer_name', - 'fieldtype': 'Data', - 'width': 120 } - ] + ]) + + if filters.get('group_by') != 'Customer': + columns.extend([ + { + 'label': _('Customer Group'), + 'fieldname': 'customer_group', + 'fieldtype': 'Link', + 'options': 'Customer Group', + 'width': 120 + } + ]) + + if filters.get('group_by') not in ('Customer', 'Customer Group'): + columns.extend([ + { + 'label': _('Customer'), + 'fieldname': 'customer', + 'fieldtype': 'Link', + 'options': 'Customer', + 'width': 120 + }, + { + 'label': _('Customer Name'), + 'fieldname': 'customer_name', + 'fieldtype': 'Data', + 'width': 120 + } + ]) if additional_table_columns: columns += additional_table_columns columns += [ - { - 'label': _('Customer Group'), - 'fieldname': 'customer_group', - 'fieldtype': 'Link', - 'options': 'Customer Group', - 'width': 120 - }, { 'label': _('Receivable Account'), 'fieldname': 'debit_to', @@ -231,14 +217,22 @@ def get_columns(additional_table_columns, filters): 'fieldname': 'mode_of_payment', 'fieldtype': 'Data', 'width': 120 - }, - { - 'label': _("Territory"), - 'fieldname': 'territory', - 'fieldtype': 'Link', - 'options': 'Territory', - 'width': 80 - }, + } + ] + + if filters.get('group_by') != 'Terriotory': + columns.extend([ + { + 'label': _("Territory"), + 'fieldname': 'territory', + 'fieldtype': 'Link', + 'options': 'Territory', + 'width': 80 + } + ]) + + + columns += [ { 'label': _('Project'), 'fieldname': 'project', @@ -307,6 +301,13 @@ def get_columns(additional_table_columns, filters): 'fieldtype': 'Currency', 'options': 'currency', 'width': 100 + }, + { + 'fieldname': 'currency', + 'label': _('Currency'), + 'fieldtype': 'Currency', + 'width': 80, + 'hidden': 1 } ] @@ -337,35 +338,34 @@ def get_conditions(filters): and ifnull(`tabSales Invoice Payment`.mode_of_payment, '') = %(mode_of_payment)s)""" if filters.get("warehouse"): - conditions += """ and exists(select name from `tabSales Invoice Item` - where parent=`tabSales Invoice`.name - and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s)""" + conditions += """and ifnull(`tabSales Invoice Item`.warehouse, '') = %(warehouse)s""" if filters.get("brand"): - conditions += """ and exists(select name from `tabSales Invoice Item` - where parent=`tabSales Invoice`.name - and ifnull(`tabSales Invoice Item`.brand, '') = %(brand)s)""" + conditions += """and ifnull(`tabSales Invoice Item`.brand, '') = %(brand)s""" if filters.get("item_group"): - conditions += """ and exists(select name from `tabSales Invoice Item` - where parent=`tabSales Invoice`.name - and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s)""" + conditions += """and ifnull(`tabSales Invoice Item`.item_group, '') = %(item_group)s""" if not filters.get("group_by"): conditions += "ORDER BY `tabSales Invoice`.posting_date desc, `tabSales Invoice Item`.item_group desc" + else: + conditions += get_group_by_conditions(filters, 'Sales Invoice') + + return conditions + +def get_group_by_conditions(filters, doctype): if filters.get("group_by"): if filters.get("group_by") == 'Invoice': - conditions += " ORDER BY `tabSales Invoice Item`.parent desc" + return "ORDER BY `tab{0} Item`.parent desc".format(doctype) elif filters.get("group_by") == 'Item': - conditions += " ORDER BY `tabSales Invoice Item`.item_code" + return "ORDER BY `tab{0} Item`.`item_code`".format(doctype) elif filters.get("group_by") == 'Item Group': - conditions += " ORDER BY `tabSales Invoice Item`.`item_group`" - elif filters.get("group_by") == 'Customer': - conditions += " ORDER BY `tabSales Invoice`.customer" + return "ORDER BY `tab{0} Item`.{1}".format(doctype, frappe.scrub(filters.get('group_by'))) + elif filters.get("group_by") in ('Customer', 'Customer Group', 'Territory', 'Supplier'): + return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get('group_by'))) - return conditions def get_items(filters, additional_query_columns): conditions = get_conditions(filters) @@ -413,14 +413,14 @@ def get_delivery_notes_against_sales_order(item_list): return so_dn_map -def get_grand_total(filters): +def get_grand_total(filters, doctype): return frappe.db.sql(""" SELECT - SUM(`tabSales Invoice`.grand_total) - FROM `tabSales Invoice` - WHERE `tabSales Invoice`.docstatus = 1 + SUM(`tab{0}`.base_grand_total) + FROM `tab{0}` + WHERE `tab{0}`.docstatus = 1 and posting_date between %s and %s - """, (filters.get('from_date'), filters.get('to_date')))[0][0] + """.format(doctype), (filters.get('from_date'), filters.get('to_date')))[0][0] def get_deducted_taxes(): return frappe.db.sql_list("select name from `tabPurchase Taxes and Charges` where add_deduct_tax = 'Deduct'") @@ -542,3 +542,65 @@ def get_tax_accounts(item_list, columns, company_currency, ] return itemised_tax, tax_columns + +def add_total_row(data, filters, prev_group_by_value, item, total_row_map, + group_by_field, subtotal_display_field, grand_total): + if prev_group_by_value != item.get(group_by_field, ''): + if prev_group_by_value: + total_row = total_row_map.get(prev_group_by_value) + total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) + data.append(total_row) + data.append({}) + + prev_group_by_value = item.get(group_by_field, '') + + total_row_map.setdefault(item.get(group_by_field, ''), { + subtotal_display_field: get_display_value(filters, group_by_field, item), + 'stock_qty': 0.0, + 'amount': 0.0, + 'bold': 1, + 'total_tax': 0.0, + 'total': 0.0 + }) + + return data, prev_group_by_value + +def get_display_value(filters, group_by_field, item): + if filters.get('group_by') == 'Item': + return "Item: " + cstr(item.get('item_code')) \ + + "

" + "Item Name: " + cstr(item.get('item_name')) + elif filters.get('group_by') in ('Customer', 'Supplier'): + return filters.get('group_by')+": " + cstr(item.get(frappe.scrub(filters.get('group_by')))) \ + + "

" + filters.get('group_by') + " Name: " + item.get(frappe.scrub(filters.get('group_by'))+'_name', '') + else: + return item.get(group_by_field) + +def get_group_by_and_display_fields(filters): + if filters.get('group_by') == 'Item': + group_by_field = 'item_code' + subtotal_display_field = 'invoice' + elif filters.get('group_by') == 'Invoice': + group_by_field = 'parent' + subtotal_display_field = 'item_code' + else: + group_by_field = frappe.scrub(filters.get('group_by')) + subtotal_display_field = 'item_code' + + return group_by_field, subtotal_display_field + +def update_total_row(item, total_row_map, group_by_value, tax_columns): + total_row = total_row_map.get(group_by_value) + total_row['stock_qty'] += item['stock_qty'] + total_row['amount'] += item['amount'] + total_row['total_tax'] += item['total_tax'] + total_row['total'] += item['total'] + + for tax in tax_columns: + total_row.setdefault(frappe.scrub(tax + ' Amount'), 0.0) + total_row.setdefault(frappe.scrub(tax + ' Rate'), 0.0) + total_row[frappe.scrub(tax + ' Rate')] += flt(item[frappe.scrub(tax + ' Rate')]) + total_row[frappe.scrub(tax + ' Amount')] += flt(item[frappe.scrub(tax + ' Amount')]) + + + + From 6f27e9798020f71bc8378243ba2d2446c360dfcc Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Mon, 27 Jan 2020 08:48:38 +0530 Subject: [PATCH 09/43] fix: Add group by functionality to purchase register --- .../item_wise_purchase_register.js | 16 +- .../item_wise_purchase_register.py | 258 +++++++++++++++--- 2 files changed, 241 insertions(+), 33 deletions(-) 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 e936a173734..f88906a0f1f 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 @@ -34,6 +34,20 @@ frappe.query_reports["Item-wise Purchase Register"] = { "label": __("Mode of Payment"), "fieldtype": "Link", "options": "Mode of Payment" + }, + { + "label": __("Group By"), + "fieldname": "group_by", + "fieldtype": "Select", + "options": ["Supplier", "Item Group", "Item", "Invoice"] } - ] + ], + "formatter": function(value, row, column, data, default_formatter) { + value = default_formatter(value, row, column, data); + if (data && data.bold) { + value = value.bold(); + + } + return value; + } } 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 380b208548c..3a5a4548f5a 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 @@ -5,7 +5,9 @@ from __future__ import unicode_literals import frappe, erpnext from frappe import _ from frappe.utils import flt -from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register import get_tax_accounts +from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register import (get_tax_accounts, + get_grand_total, add_total_row, get_display_value, get_group_by_and_display_fields, update_total_row, + get_group_by_conditions) def execute(filters=None): return _execute(filters) @@ -13,7 +15,7 @@ def execute(filters=None): def _execute(filters=None, additional_table_columns=None, additional_query_columns=None): if not filters: filters = {} filters.update({"from_date": filters.get("date_range")[0], "to_date": filters.get("date_range")[1]}) - columns = get_columns(additional_table_columns) + columns = get_columns(additional_table_columns, filters) company_currency = erpnext.get_company_currency(filters.company) @@ -23,16 +25,15 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum itemised_tax, tax_columns = get_tax_accounts(item_list, columns, company_currency, doctype="Purchase Invoice", tax_doctype="Purchase Taxes and Charges") - columns.append({ - "fieldname": "currency", - "label": _("Currency"), - "fieldtype": "Data", - "width": 80 - }) - po_pr_map = get_purchase_receipts_against_purchase_order(item_list) data = [] + total_row_map = {} + prev_group_by_value = '' + + if filters.get('group_by'): + grand_total = get_grand_total(filters, 'Purchase Invoice') + for d in item_list: if not d.stock_qty: continue @@ -44,51 +45,240 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum purchase_receipt = ", ".join(po_pr_map.get(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.description, d.parent, d.posting_date, d.supplier, - d.supplier_name] + + row = { + 'item_code': d.item_code, + 'item_name': d.item_name, + 'item_group': d.item_group, + 'description': d.description, + 'invoice': d.parent, + 'posting_date': d.posting_date, + 'customer': d.supplier, + 'customer_name': d.supplier_name + } if additional_query_columns: for col in additional_query_columns: - row.append(d.get(col)) + row.update({ + col: d.get(col) + }) - row += [ - d.credit_to, d.mode_of_payment, d.project, d.company, d.purchase_order, - purchase_receipt, expense_account, d.stock_qty, d.stock_uom, d.base_net_amount / d.stock_qty, d.base_net_amount - ] + row.update({ + 'credit_to': d.credit_to, + 'mode_of_payment': d.mode_of_payment, + 'project': d.project, + 'company': d.company, + 'purchase_order': d.purchase_order, + 'purchase_receipt': d.purchase_receipt, + 'expense_account': expense_account, + 'stock_qty': d.stock_qty, + 'stock_uom': d.stock_uom, + 'rate': d.base_net_amount / d.stock_qty, + 'amount': d.base_net_amount + }) total_tax = 0 for tax in tax_columns: item_tax = itemised_tax.get(d.name, {}).get(tax, {}) - row += [item_tax.get("tax_rate", 0), item_tax.get("tax_amount", 0)] + row.update({ + frappe.scrub(tax + ' Rate'): item_tax.get("tax_rate", 0), + frappe.scrub(tax + ' Amount'): item_tax.get("tax_amount", 0), + }) total_tax += flt(item_tax.get("tax_amount")) - row += [total_tax, d.base_net_amount + total_tax, company_currency] + row.update({ + 'total_tax': total_tax, + 'total': d.base_net_amount + total_tax, + 'currency': company_currency + }) + + if filters.get('group_by'): + row.update({'percent_gt': flt(row['total']/grand_total) * 100}) + group_by_field, subtotal_display_field = get_group_by_and_display_fields(filters) + data, prev_group_by_value = add_total_row(data, filters, prev_group_by_value, d, total_row_map, + group_by_field, subtotal_display_field, grand_total) + update_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns) data.append(row) + if filters.get('group_by'): + total_row = total_row_map.get(prev_group_by_value or d.get('item_name')) + total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) + data.append(total_row) + data.append({}) + return columns, data -def get_columns(additional_table_columns): - columns = [ - _("Item Code") + ":Link/Item:120", _("Item Name") + "::120", - _("Item Group") + ":Link/Item Group:100", "Description::150", _("Invoice") + ":Link/Purchase Invoice:120", - _("Posting Date") + ":Date:80", _("Supplier") + ":Link/Supplier:120", - "Supplier Name::120" - ] +def get_columns(additional_table_columns, filters): + + columns = [] + + if filters.get('group_by') != ('Item'): + columns.extend( + [ + { + 'label': _('Item Code'), + 'fieldname': 'item_code', + 'fieldtype': 'Link', + 'options': 'Item', + 'width': 120 + }, + { + 'label': _('Item Name'), + 'fieldname': 'item_name', + 'fieldtype': 'Data', + 'width': 120 + } + ] + ) + + if filters.get('group_by') not in ('Item', 'Item Group'): + columns.extend([ + { + 'label': _('Item Group'), + 'fieldname': 'item_group', + 'fieldtype': 'Link', + 'options': 'Item Group', + 'width': 120 + } + ]) + + columns.extend([ + { + 'label': _('Description'), + 'fieldname': 'description', + 'fieldtype': 'Data', + 'width': 150 + }, + { + 'label': _('Invoice'), + 'fieldname': 'invoice', + 'fieldtype': 'Link', + 'options': 'Purchase Invoice', + 'width': 120 + }, + { + 'label': _('Posting Date'), + 'fieldname': 'posting_date', + 'fieldtype': 'Date', + 'width': 120 + } + ]) + + if filters.get('group_by') != 'Supplier': + columns.extend([ + { + 'label': _('Supplier'), + 'fieldname': 'supplier', + 'fieldtype': 'Link', + 'options': 'Supplier', + 'width': 120 + }, + { + 'label': _('Supplier Name'), + 'fieldname': 'supplier_name', + 'fieldtype': 'Data', + 'width': 120 + } + ]) if additional_table_columns: columns += additional_table_columns columns += [ - "Payable Account:Link/Account:120", - _("Mode of Payment") + ":Link/Mode of Payment:80", _("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", - _("Stock Qty") + ":Float:120", _("Stock UOM") + "::100", - _("Rate") + ":Currency/currency:120", _("Amount") + ":Currency/currency:120" + { + 'label': _('Payable Account'), + 'fieldname': 'credit_to', + 'fieldtype': 'Link', + 'options': 'Account', + 'width': 80 + }, + { + 'label': _('Mode Of Payment'), + 'fieldname': 'mode_of_payment', + 'fieldtype': 'Data', + 'width': 120 + }, + { + 'label': _('Project'), + 'fieldname': 'project', + 'fieldtype': 'Link', + 'options': 'Project', + 'width': 80 + }, + { + 'label': _('Company'), + 'fieldname': 'company', + 'fieldtype': 'Link', + 'options': 'Company', + 'width': 80 + }, + { + 'label': _('Purchase Order'), + 'fieldname': 'purchase_order', + 'fieldtype': 'Link', + 'options': 'Purchase Order', + 'width': 100 + }, + { + 'label': _("Purchase Receipt"), + 'fieldname': 'Purchase Receipt', + 'fieldtype': 'Link', + 'options': 'Purchase Receipt', + 'width': 100 + }, + { + 'label': _('Expense Account'), + 'fieldname': 'expense_account', + 'fieldtype': 'Link', + 'options': 'Account', + 'width': 100 + }, + { + 'label': _('Stock Qty'), + 'fieldname': 'stock_qty', + 'fieldtype': 'Float', + 'width': 100 + }, + { + 'label': _('Stock UOM'), + 'fieldname': 'stock_uom', + 'fieldtype': 'Link', + 'options': 'UOM', + 'width': 100 + }, + { + 'label': _('Rate'), + 'fieldname': 'rate', + 'fieldtype': 'Float', + 'options': 'currency', + 'width': 100 + }, + { + 'label': _('Amount'), + 'fieldname': 'amount', + 'fieldtype': 'Currency', + 'options': 'currency', + 'width': 100 + }, + { + 'fieldname': 'currency', + 'label': _('Currency'), + 'fieldtype': 'Currency', + 'width': 80, + 'hidden': 1 + } ] + if filters.get('group_by'): + columns.append({ + 'label': _('% Of Grand Total'), + 'fieldname': 'percent_gt', + 'fieldtype': 'Float', + 'width': 80 + }) + return columns def get_conditions(filters): @@ -103,6 +293,11 @@ def get_conditions(filters): if filters.get(opts[0]): conditions += opts[1] + if not filters.get("group_by"): + conditions += "ORDER BY `tabPurchase Invoice`.posting_date desc, `tabPurchase Invoice Item`.item_code desc" + else: + conditions += get_group_by_conditions(filters, 'Purchase Invoice') + return conditions def get_items(filters, additional_query_columns): @@ -129,7 +324,6 @@ def get_items(filters, additional_query_columns): from `tabPurchase Invoice`, `tabPurchase Invoice Item` where `tabPurchase Invoice`.name = `tabPurchase Invoice Item`.`parent` and `tabPurchase Invoice`.docstatus = 1 %s %s - order by `tabPurchase Invoice`.posting_date desc, `tabPurchase Invoice Item`.item_code desc """.format(additional_query_columns) % (conditions, match_conditions), filters, as_dict=1) def get_aii_accounts(): From eec0ee83e228f20db1694098589fb8469d227971 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Mon, 27 Jan 2020 15:48:01 +0530 Subject: [PATCH 10/43] fix: Changes in total row display --- .../item_wise_sales_register.py | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) 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 57a99ef76a9..cf48ad4701d 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 @@ -355,17 +355,14 @@ def get_conditions(filters): return conditions def get_group_by_conditions(filters, doctype): - - if filters.get("group_by"): - if filters.get("group_by") == 'Invoice': - return "ORDER BY `tab{0} Item`.parent desc".format(doctype) - elif filters.get("group_by") == 'Item': - return "ORDER BY `tab{0} Item`.`item_code`".format(doctype) - elif filters.get("group_by") == 'Item Group': - return "ORDER BY `tab{0} Item`.{1}".format(doctype, frappe.scrub(filters.get('group_by'))) - elif filters.get("group_by") in ('Customer', 'Customer Group', 'Territory', 'Supplier'): - return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get('group_by'))) - + if filters.get("group_by") == 'Invoice': + return "ORDER BY `tab{0} Item`.parent desc".format(doctype) + elif filters.get("group_by") == 'Item': + return "ORDER BY `tab{0} Item`.`item_code`".format(doctype) + elif filters.get("group_by") == 'Item Group': + return "ORDER BY `tab{0} Item`.{1}".format(doctype, frappe.scrub(filters.get('group_by'))) + elif filters.get("group_by") in ('Customer', 'Customer Group', 'Territory', 'Supplier'): + return "ORDER BY `tab{0}`.{1}".format(doctype, frappe.scrub(filters.get('group_by'))) def get_items(filters, additional_query_columns): conditions = get_conditions(filters) @@ -420,7 +417,7 @@ def get_grand_total(filters, doctype): FROM `tab{0}` WHERE `tab{0}`.docstatus = 1 and posting_date between %s and %s - """.format(doctype), (filters.get('from_date'), filters.get('to_date')))[0][0] + """.format(doctype), (filters.get('from_date'), filters.get('to_date')))[0][0] #nosec def get_deducted_taxes(): return frappe.db.sql_list("select name from `tabPurchase Taxes and Charges` where add_deduct_tax = 'Deduct'") @@ -567,13 +564,22 @@ def add_total_row(data, filters, prev_group_by_value, item, total_row_map, def get_display_value(filters, group_by_field, item): if filters.get('group_by') == 'Item': - return "Item: " + cstr(item.get('item_code')) \ - + "

" + "Item Name: " + cstr(item.get('item_name')) + if item.get('item_code') != item.get('item_name'): + value = item.get('item_code') + "

" + \ + "" + item.get('item_name') + "" + else: + value = cstr(item.get('item_code')) elif filters.get('group_by') in ('Customer', 'Supplier'): - return filters.get('group_by')+": " + cstr(item.get(frappe.scrub(filters.get('group_by')))) \ - + "

" + filters.get('group_by') + " Name: " + item.get(frappe.scrub(filters.get('group_by'))+'_name', '') + party = frappe.scrub(filters.get('group_by')) + if item.get(party) != item.get(party+'_name'): + value = item.get(party) + "

" + \ + "" + item.get(party+'_name') + "" + else: + value = item.get(party) else: - return item.get(group_by_field) + value = item.get(group_by_field) + + return value def get_group_by_and_display_fields(filters): if filters.get('group_by') == 'Item': From 7524ecbc59d33efc454c4f0904057f81379969ae Mon Sep 17 00:00:00 2001 From: Raffael Meyer Date: Thu, 30 Jan 2020 00:08:25 +0100 Subject: [PATCH 11/43] fix #20469 --- erpnext/regional/report/datev/datev.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/regional/report/datev/datev.py b/erpnext/regional/report/datev/datev.py index 589165173ac..a58e13a0947 100644 --- a/erpnext/regional/report/datev/datev.py +++ b/erpnext/regional/report/datev/datev.py @@ -160,7 +160,7 @@ def get_gl_entries(filters, as_dict): where gl.company = %(company)s and DATE(gl.posting_date) >= %(from_date)s and DATE(gl.posting_date) <= %(to_date)s - order by 'Belegdatum', gl.voucher_no""", filters, as_dict=as_dict, as_utf8=1) + order by 'Belegdatum', gl.voucher_no""", filters, as_dict=as_dict) return gl_entries From ba4d9469ffd974001e4caab04beeda21f135a0b9 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Thu, 30 Jan 2020 15:33:51 +0530 Subject: [PATCH 12/43] fix: Do not show any finance book record if no finance book filter is applied --- erpnext/accounts/report/cash_flow/cash_flow.py | 2 ++ erpnext/accounts/report/financial_statements.py | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/cash_flow/cash_flow.py b/erpnext/accounts/report/cash_flow/cash_flow.py index 0b124774479..702c81ccb76 100644 --- a/erpnext/accounts/report/cash_flow/cash_flow.py +++ b/erpnext/accounts/report/cash_flow/cash_flow.py @@ -136,6 +136,8 @@ def get_account_type_based_gl_data(company, start_date, end_date, account_type, cond = """ AND (finance_book in (%s, %s, '') OR finance_book IS NULL) """ %(frappe.db.escape(filters.finance_book), frappe.db.escape(company_fb)) + else: + cond = "AND (finance_book = '' OR finance_book IS NULL)" gl_sum = frappe.db.sql_list(""" select sum(credit) - sum(debit) diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index 32d9075f443..a1ecaae2a11 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -13,7 +13,7 @@ import frappe, erpnext from erpnext.accounts.report.utils import get_currency, convert_to_presentation_currency from erpnext.accounts.utils import get_fiscal_year from frappe import _ -from frappe.utils import (flt, getdate, get_first_day, add_months, add_days, formatdate) +from frappe.utils import (flt, getdate, get_first_day, add_months, add_days, formatdate, cstr) from six import itervalues from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_accounting_dimensions @@ -356,7 +356,7 @@ def set_gl_entries_by_account( "company": company, "from_date": from_date, "to_date": to_date, - "finance_book": filters.get("finance_book") + "finance_book": cstr(filters.get("finance_book")) } if filters.get("include_default_book_entries"): @@ -411,6 +411,8 @@ def get_additional_conditions(from_date, ignore_closing_entries, filters): additional_conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)") else: additional_conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)") + else: + additional_conditions.append("(finance_book = '' OR finance_book IS NULL)") if accounting_dimensions: for dimension in accounting_dimensions: From 9826291c524f0b09c341e0b6501c918205897435 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Fri, 31 Jan 2020 09:08:29 +0530 Subject: [PATCH 13/43] fix: Filtering fixes in financial statement --- erpnext/accounts/report/cash_flow/cash_flow.py | 9 ++++----- .../consolidated_financial_statement.py | 9 ++++----- erpnext/accounts/report/financial_statements.py | 11 ++++------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/erpnext/accounts/report/cash_flow/cash_flow.py b/erpnext/accounts/report/cash_flow/cash_flow.py index 702c81ccb76..3c2aa654d98 100644 --- a/erpnext/accounts/report/cash_flow/cash_flow.py +++ b/erpnext/accounts/report/cash_flow/cash_flow.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe from frappe import _ -from frappe.utils import cint +from frappe.utils import cint, cstr from erpnext.accounts.report.financial_statements import (get_period_list, get_columns, get_data) from erpnext.accounts.report.profit_and_loss_statement.profit_and_loss_statement import get_net_profit_loss from erpnext.accounts.utils import get_fiscal_year @@ -130,14 +130,13 @@ def get_account_type_based_gl_data(company, start_date, end_date, account_type, filters = frappe._dict(filters) if filters.finance_book: - cond = " AND (finance_book in (%s, '') OR finance_book IS NULL)" %(frappe.db.escape(filters.finance_book)) if filters.include_default_book_entries: company_fb = frappe.db.get_value("Company", company, 'default_finance_book') - cond = """ AND (finance_book in (%s, %s, '') OR finance_book IS NULL) """ %(frappe.db.escape(filters.finance_book), frappe.db.escape(company_fb)) - else: - cond = "AND (finance_book = '' OR finance_book IS NULL)" + else: + cond = " AND (finance_book in (%s, '') OR finance_book IS NULL)" %(frappe.db.escape(cstr(filters.finance_book))) + gl_sum = frappe.db.sql_list(""" select sum(credit) - sum(debit) diff --git a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py index e9eb819cc64..4a79b6a340e 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py @@ -387,11 +387,10 @@ def get_additional_conditions(from_date, ignore_closing_entries, filters): if from_date: additional_conditions.append("gl.posting_date >= %(from_date)s") - if filters.get("finance_book"): - if filters.get("include_default_book_entries"): - additional_conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)") - else: - additional_conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)") + if filters.get("include_default_book_entries"): + additional_conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)") + else: + additional_conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)") return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else "" diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index a1ecaae2a11..57e8e0ea8fc 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -406,14 +406,11 @@ def get_additional_conditions(from_date, ignore_closing_entries, filters): filters.cost_center = get_cost_centers_with_children(filters.cost_center) additional_conditions.append("cost_center in %(cost_center)s") - if filters.get("finance_book"): - if filters.get("include_default_book_entries"): - additional_conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)") - else: - additional_conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)") + if filters.get("include_default_book_entries"): + additional_conditions.append("(finance_book in (%(finance_book)s, %(company_fb)s, '') OR finance_book IS NULL)") else: - additional_conditions.append("(finance_book = '' OR finance_book IS NULL)") - + additional_conditions.append("(finance_book in (%(finance_book)s, '') OR finance_book IS NULL)") + if accounting_dimensions: for dimension in accounting_dimensions: if filters.get(dimension): From bb7cf81d52facee21971aa353cd3193020535fe6 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Fri, 31 Jan 2020 11:16:30 +0530 Subject: [PATCH 14/43] fix: Cash flow filter fix --- erpnext/accounts/report/cash_flow/cash_flow.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/report/cash_flow/cash_flow.py b/erpnext/accounts/report/cash_flow/cash_flow.py index 3c2aa654d98..e349a6aaaf0 100644 --- a/erpnext/accounts/report/cash_flow/cash_flow.py +++ b/erpnext/accounts/report/cash_flow/cash_flow.py @@ -129,14 +129,13 @@ def get_account_type_based_gl_data(company, start_date, end_date, account_type, cond = "" filters = frappe._dict(filters) - if filters.finance_book: - if filters.include_default_book_entries: - company_fb = frappe.db.get_value("Company", company, 'default_finance_book') - cond = """ AND (finance_book in (%s, %s, '') OR finance_book IS NULL) - """ %(frappe.db.escape(filters.finance_book), frappe.db.escape(company_fb)) - else: - cond = " AND (finance_book in (%s, '') OR finance_book IS NULL)" %(frappe.db.escape(cstr(filters.finance_book))) - + if filters.include_default_book_entries: + company_fb = frappe.db.get_value("Company", company, 'default_finance_book') + cond = """ AND (finance_book in (%s, %s, '') OR finance_book IS NULL) + """ %(frappe.db.escape(filters.finance_book), frappe.db.escape(company_fb)) + else: + cond = " AND (finance_book in (%s, '') OR finance_book IS NULL)" %(frappe.db.escape(cstr(filters.finance_book))) + gl_sum = frappe.db.sql_list(""" select sum(credit) - sum(debit) From 43886ca01676a8856f430a914e33f27ea37c89fc Mon Sep 17 00:00:00 2001 From: "Parth J. Kharwar" Date: Fri, 31 Jan 2020 14:37:56 +0530 Subject: [PATCH 15/43] fix: employee checkin doctype time permissions (#20473) --- .../employee_checkin/employee_checkin.js | 8 ++- .../employee_checkin/employee_checkin.json | 60 ++++++++++++++++++- 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/erpnext/hr/doctype/employee_checkin/employee_checkin.js b/erpnext/hr/doctype/employee_checkin/employee_checkin.js index f11cc9b2522..c2403ca2bd9 100644 --- a/erpnext/hr/doctype/employee_checkin/employee_checkin.js +++ b/erpnext/hr/doctype/employee_checkin/employee_checkin.js @@ -2,7 +2,9 @@ // For license information, please see license.txt frappe.ui.form.on('Employee Checkin', { - // refresh: function(frm) { - - // } + setup: (frm) => { + if(!frm.doc.time) { + frm.set_value("time", frappe.datetime.now_datetime()); + } + } }); diff --git a/erpnext/hr/doctype/employee_checkin/employee_checkin.json b/erpnext/hr/doctype/employee_checkin/employee_checkin.json index 08fa4afa5cb..75f699751b8 100644 --- a/erpnext/hr/doctype/employee_checkin/employee_checkin.json +++ b/erpnext/hr/doctype/employee_checkin/employee_checkin.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_import": 1, "autoname": "EMP-CKIN-.MM.-.YYYY.-.######", "creation": "2019-06-10 11:56:34.536413", @@ -23,7 +24,6 @@ { "fieldname": "employee", "fieldtype": "Link", - "in_list_view": 1, "label": "Employee", "options": "Employee", "reqd": 1 @@ -32,14 +32,17 @@ "fetch_from": "employee.employee_name", "fieldname": "employee_name", "fieldtype": "Data", + "in_list_view": 1, "label": "Employee Name", "read_only": 1 }, { "fieldname": "log_type", "fieldtype": "Select", + "in_list_view": 1, "label": "Log Type", - "options": "\nIN\nOUT" + "options": "\nIN\nOUT", + "reqd": 1 }, { "fieldname": "shift", @@ -58,6 +61,7 @@ "fieldtype": "Datetime", "in_list_view": 1, "label": "Time", + "permlevel": 1, "reqd": 1 }, { @@ -103,7 +107,8 @@ "label": "Shift Actual End" } ], - "modified": "2019-07-23 23:47:33.975263", + "links": [], + "modified": "2020-01-23 04:57:42.551355", "modified_by": "Administrator", "module": "HR", "name": "Employee Checkin", @@ -147,9 +152,58 @@ "role": "HR User", "share": 1, "write": 1 + }, + { + "create": 1, + "delete": 1, + "read": 1, + "role": "Employee", + "write": 1 + }, + { + "delete": 1, + "email": 1, + "export": 1, + "permlevel": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "delete": 1, + "email": 1, + "export": 1, + "permlevel": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR Manager", + "share": 1, + "write": 1 + }, + { + "delete": 1, + "email": 1, + "export": 1, + "permlevel": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "HR User", + "share": 1, + "write": 1 + }, + { + "permlevel": 1, + "read": 1, + "role": "Employee" } ], "sort_field": "modified", "sort_order": "ASC", + "title_field": "employee_name", "track_changes": 1 } \ No newline at end of file From 831a7ddd6f43b58f3625edf85d8f74f729736ccb Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Sat, 1 Feb 2020 23:14:11 +0530 Subject: [PATCH 16/43] fix: Minor fixes --- .../item_wise_sales_register.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 cf48ad4701d..dc900f09e36 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 @@ -106,7 +106,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum group_by_field, subtotal_display_field = get_group_by_and_display_fields(filters) data, prev_group_by_value = add_total_row(data, filters, prev_group_by_value, d, total_row_map, group_by_field, subtotal_display_field, grand_total) - update_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns) + add_sub_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns) data.append(row) @@ -565,10 +565,10 @@ def add_total_row(data, filters, prev_group_by_value, item, total_row_map, def get_display_value(filters, group_by_field, item): if filters.get('group_by') == 'Item': if item.get('item_code') != item.get('item_name'): - value = item.get('item_code') + "

" + \ - "" + item.get('item_name') + "" + value = cstr(item.get('item_code')) + "

" + \ + "" + cstr(item.get('item_name')) + "" else: - value = cstr(item.get('item_code')) + value = item.get('item_code', '') elif filters.get('group_by') in ('Customer', 'Supplier'): party = frappe.scrub(filters.get('group_by')) if item.get(party) != item.get(party+'_name'): @@ -594,7 +594,7 @@ def get_group_by_and_display_fields(filters): return group_by_field, subtotal_display_field -def update_total_row(item, total_row_map, group_by_value, tax_columns): +def add_sub_total_row(item, total_row_map, group_by_value, tax_columns): total_row = total_row_map.get(group_by_value) total_row['stock_qty'] += item['stock_qty'] total_row['amount'] += item['amount'] From a4219f1cfe8bba35134f6bbc0df80d75a5aaf7a0 Mon Sep 17 00:00:00 2001 From: Saqib Date: Mon, 3 Feb 2020 15:40:53 +0530 Subject: [PATCH 17/43] fix: gst permission for gst settings & hsn code (#20501) * fix: gst permission for gst settings & hsn code * Fix: Typo Co-authored-by: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> --- erpnext/regional/india/setup.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/erpnext/regional/india/setup.py b/erpnext/regional/india/setup.py index 14fdba013c7..cabfde40ef4 100644 --- a/erpnext/regional/india/setup.py +++ b/erpnext/regional/india/setup.py @@ -79,9 +79,10 @@ def add_custom_roles_for_reports(): def add_permissions(): for doctype in ('GST HSN Code', 'GST Settings'): add_permission(doctype, 'All', 0) - add_permission(doctype, 'Accounts Manager', 0) - update_permission_property(doctype, 'Accounts Manager', 0, 'write', 1) - update_permission_property(doctype, 'Accounts Manager', 0, 'create', 1) + for role in ('Accounts Manager', 'System Manager', 'Item Manager', 'Stock Manager'): + add_permission(doctype, role, 0) + update_permission_property(doctype, role, 0, 'write', 1) + update_permission_property(doctype, role, 0, 'create', 1) def add_print_formats(): frappe.reload_doc("regional", "print_format", "gst_tax_invoice") @@ -718,4 +719,4 @@ def get_tds_details(accounts, fiscal_year): doctype="Tax Withholding Category", accounts=accounts, rates=[{"fiscal_year": fiscal_year, "tax_withholding_rate": 20, "single_threshold": 2500, "cumulative_threshold": 0}]) - ] \ No newline at end of file + ] From f3c94315c36da6b071f64fb5297924d39fbd5695 Mon Sep 17 00:00:00 2001 From: Saqib Date: Mon, 3 Feb 2020 15:53:22 +0530 Subject: [PATCH 18/43] feat: add tax category in pos profile (#20414) * feat: add tax category in pos profile * fix: review fixes --- erpnext/accounts/doctype/pos_profile/pos_profile.json | 10 +++++++++- .../accounts/doctype/sales_invoice/sales_invoice.py | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/pos_profile/pos_profile.json b/erpnext/accounts/doctype/pos_profile/pos_profile.json index aa9f85a05ab..fba1bed9dd1 100644 --- a/erpnext/accounts/doctype/pos_profile/pos_profile.json +++ b/erpnext/accounts/doctype/pos_profile/pos_profile.json @@ -3,6 +3,7 @@ "autoname": "Prompt", "creation": "2013-05-24 12:15:51", "doctype": "DocType", + "engine": "InnoDB", "field_order": [ "disabled", "section_break_2", @@ -50,6 +51,7 @@ "income_account", "expense_account", "taxes_and_charges", + "tax_category", "apply_discount_on", "accounting_dimensions_section", "cost_center", @@ -381,11 +383,17 @@ { "fieldname": "dimension_col_break", "fieldtype": "Column Break" + }, + { + "fieldname": "tax_category", + "fieldtype": "Link", + "label": "Tax Category", + "options": "Tax Category" } ], "icon": "icon-cog", "idx": 1, - "modified": "2019-05-25 22:56:30.352693", + "modified": "2020-01-24 15:52:03.797701", "modified_by": "Administrator", "module": "Accounts", "name": "POS Profile", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index a421cc4d6dc..0dc889c0b7a 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -412,6 +412,9 @@ class SalesInvoice(SellingController): if pos: self.allow_print_before_pay = pos.allow_print_before_pay + + if not for_validate: + self.tax_category = pos.get("tax_category") if not for_validate and not self.customer: self.customer = pos.customer From 85c6480b412cc3d76c180fbc80b65afe6061ba18 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Mon, 3 Feb 2020 16:16:42 +0530 Subject: [PATCH 19/43] fix(Report): Quality Review report sql fix (#20425) * fix: report fix * fix: add QM permission * fix: add QM permission --- .../quality_review/quality_review.json | 14 ++++++- .../report/review/review.json | 38 ++++++++++--------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/erpnext/quality_management/doctype/quality_review/quality_review.json b/erpnext/quality_management/doctype/quality_review/quality_review.json index bd5e9351f46..a345dac026d 100644 --- a/erpnext/quality_management/doctype/quality_review/quality_review.json +++ b/erpnext/quality_management/doctype/quality_review/quality_review.json @@ -73,7 +73,7 @@ "reqd": 1 } ], - "modified": "2019-05-26 23:12:47.302189", + "modified": "2020-02-01 10:57:27.119312", "modified_by": "Administrator", "module": "Quality Management", "name": "Quality Review", @@ -102,6 +102,18 @@ "role": "All", "share": 1, "write": 1 + }, + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Quality Manager", + "share": 1, + "write": 1 } ], "sort_field": "modified", diff --git a/erpnext/quality_management/report/review/review.json b/erpnext/quality_management/report/review/review.json index 7fce2d4c57c..7fff0fdca6c 100644 --- a/erpnext/quality_management/report/review/review.json +++ b/erpnext/quality_management/report/review/review.json @@ -1,24 +1,28 @@ { - "add_total_row": 0, - "creation": "2018-10-16 12:28:43.651915", - "disabled": 0, - "docstatus": 0, - "doctype": "Report", - "idx": 0, - "is_standard": "Yes", - "modified": "2018-10-16 15:23:25.667237", - "modified_by": "Administrator", - "module": "Quality Management", - "name": "Review", - "owner": "Administrator", - "prepared_report": 0, - "query": "SELECT\n `tabQuality Action`.name as \"Name:Data:200\",\n `tabQuality Action`.action as \"Action:Select/[corrective,Preventive]:200\",\n `tabQuality Action`.review as \"Review:Link/Quality Review:200\",\n `tabQuality Action`.date as \"Date:Date:120\",\n `tabQuality Action`.status as \"Status:Select/Planned:150\"\nFROM\n `tabQuality Action`\nWHERE\n `tabQuality Action`.type='Quality Review'\n \n ", - "ref_doctype": "Quality Action", - "report_name": "Review", - "report_type": "Query Report", + "add_total_row": 0, + "creation": "2018-10-16 12:28:43.651915", + "disable_prepared_report": 0, + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2020-02-01 11:04:47.299453", + "modified_by": "Administrator", + "module": "Quality Management", + "name": "Review", + "owner": "Administrator", + "prepared_report": 0, + "query": "SELECT\n `tabQuality Action`.name as \"Name:Data:200\",\n `tabQuality Action`.corrective_preventive as \"Action:Select/[Corrective,Preventive]:200\",\n `tabQuality Action`.document_type as \"Document Type:Select/[Quality Review, Quality Feedback]:200\",\n `tabQuality Action`.date as \"Date:Date:120\",\n `tabQuality Action`.status as \"Status:Select/Planned:150\"\nFROM\n `tabQuality Action`\nWHERE\n `tabQuality Action`.document_type='Quality Review'\n \n ", + "ref_doctype": "Quality Action", + "report_name": "Review", + "report_type": "Query Report", "roles": [ { "role": "System Manager" + }, + { + "role": "Quality Manager" } ] } \ No newline at end of file From 3ef80f2d2eee76dddf85924dd6ca93d912d5cb5c Mon Sep 17 00:00:00 2001 From: Pranav Nachnekar Date: Mon, 3 Feb 2020 11:35:30 +0000 Subject: [PATCH 20/43] fix: disallow quick entry for doctypes with tree view (#20453) * fix: imporer escaping * fix: disallow quick entry for doctypes with tree view --- .../doctype/cost_center/cost_center.json | 5 +- erpnext/assets/doctype/location/location.json | 565 +--------- .../customer_group/customer_group.json | 8 +- .../setup/doctype/item_group/item_group.json | 1001 ++++------------- .../doctype/sales_person/sales_person.json | 470 +------- .../setup/doctype/territory/territory.json | 614 +++------- .../stock/doctype/warehouse/warehouse.json | 7 +- 7 files changed, 459 insertions(+), 2211 deletions(-) diff --git a/erpnext/accounts/doctype/cost_center/cost_center.json b/erpnext/accounts/doctype/cost_center/cost_center.json index 5149be216b3..976f05ad637 100644 --- a/erpnext/accounts/doctype/cost_center/cost_center.json +++ b/erpnext/accounts/doctype/cost_center/cost_center.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_copy": 1, "allow_import": 1, "allow_rename": 1, @@ -123,7 +124,8 @@ ], "icon": "fa fa-money", "idx": 1, - "modified": "2019-09-16 14:44:17.103548", + "links": [], + "modified": "2020-01-28 13:50:23.430434", "modified_by": "Administrator", "module": "Accounts", "name": "Cost Center", @@ -162,7 +164,6 @@ "role": "Purchase User" } ], - "quick_entry": 1, "search_fields": "parent_cost_center, is_group", "show_name_in_global_search": 1, "sort_field": "modified", diff --git a/erpnext/assets/doctype/location/location.json b/erpnext/assets/doctype/location/location.json index 5dc13062b26..5ecc72ab913 100644 --- a/erpnext/assets/doctype/location/location.json +++ b/erpnext/assets/doctype/location/location.json @@ -1,580 +1,146 @@ { - "allow_copy": 0, - "allow_guest_to_view": 0, + "actions": [], "allow_import": 1, "allow_rename": 1, "autoname": "field:location_name", - "beta": 0, "creation": "2018-05-07 12:49:22.595974", - "custom": 0, - "docstatus": 0, "doctype": "DocType", - "document_type": "", "editable_grid": 1, "engine": "InnoDB", + "field_order": [ + "location_name", + "parent_location", + "cb_details", + "is_container", + "is_group", + "sb_location_details", + "latitude", + "longitude", + "cb_latlong", + "area", + "area_uom", + "sb_geolocation", + "location", + "tree_details", + "lft", + "rgt", + "old_parent" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "location_name", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Location Name", - "length": 0, "no_copy": 1, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, "unique": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "parent_location", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Parent Location", - "length": 0, - "no_copy": 0, "options": "Location", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "cb_details", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, + "default": "0", "description": "Check if it is a hydroponic unit", "fieldname": "is_container", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Is Container", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Is Container" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, "bold": 1, - "collapsible": 0, - "columns": 0, + "default": "0", "fieldname": "is_group", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, - "label": "Is Group", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Is Group" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "sb_location_details", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Location Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Location Details" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fetch_from": "parent_location.latitude", "fieldname": "latitude", "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Latitude", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Latitude" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fetch_from": "parent_location.longitude", "fieldname": "longitude", "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Longitude", - "length": 0, - "no_copy": 0, - "options": "", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Longitude" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "cb_latlong", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "area", "fieldtype": "Float", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Area", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "depends_on": "eval:doc.area", "fieldname": "area_uom", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Area UOM", - "length": 0, - "no_copy": 0, - "options": "UOM", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "UOM" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "sb_geolocation", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Section Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "location", "fieldtype": "Geolocation", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Location", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Location" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "tree_details", "fieldtype": "Section Break", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Tree Details", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Tree Details" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "lft", "fieldtype": "Int", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "lft", - "length": 0, "no_copy": 1, - "permlevel": 0, - "precision": "", "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "rgt", "fieldtype": "Int", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "rgt", - "length": 0, "no_copy": 1, - "permlevel": 0, - "precision": "", "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "old_parent", "fieldtype": "Data", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Old Parent", - "length": 0, "no_copy": 1, - "permlevel": 0, - "precision": "", "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 } ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2018-07-11 13:36:30.999405", + "links": [], + "modified": "2020-01-28 13:52:22.513425", "modified_by": "Administrator", "module": "Assets", "name": "Location", @@ -582,127 +148,78 @@ "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "System Manager", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Stock User", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Accounts User", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Stock Manager", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Agriculture Manager", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Agriculture User", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 } ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, "show_name_in_global_search": 1, "sort_field": "modified", "sort_order": "DESC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 + "track_changes": 1 } \ No newline at end of file diff --git a/erpnext/setup/doctype/customer_group/customer_group.json b/erpnext/setup/doctype/customer_group/customer_group.json index 3565b4b38a9..7fa242ae19d 100644 --- a/erpnext/setup/doctype/customer_group/customer_group.json +++ b/erpnext/setup/doctype/customer_group/customer_group.json @@ -1,11 +1,12 @@ { - "_comments": "[]", + "actions": [], "allow_import": 1, "allow_rename": 1, "autoname": "field:customer_group_name", "creation": "2013-01-10 16:34:23", "doctype": "DocType", "document_type": "Setup", + "engine": "InnoDB", "field_order": [ "customer_group_name", "parent_customer_group", @@ -136,7 +137,8 @@ ], "icon": "fa fa-sitemap", "idx": 1, - "modified": "2019-09-06 12:40:14.954697", + "links": [], + "modified": "2020-01-28 13:49:23.961708", "modified_by": "Administrator", "module": "Setup", "name": "Customer Group", @@ -187,8 +189,8 @@ "role": "Sales Manager" } ], - "quick_entry": 1, "search_fields": "parent_customer_group", "show_name_in_global_search": 1, + "sort_field": "modified", "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/setup/doctype/item_group/item_group.json b/erpnext/setup/doctype/item_group/item_group.json index 656d460e0f5..36e3e68ef43 100644 --- a/erpnext/setup/doctype/item_group/item_group.json +++ b/erpnext/setup/doctype/item_group/item_group.json @@ -1,817 +1,252 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "field:item_group_name", - "beta": 0, - "creation": "2013-03-28 10:35:29", - "custom": 0, - "description": "Item Classification", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 0, + "actions": [], + "allow_import": 1, + "allow_rename": 1, + "autoname": "field:item_group_name", + "creation": "2013-03-28 10:35:29", + "description": "Item Classification", + "doctype": "DocType", + "document_type": "Setup", + "engine": "InnoDB", + "field_order": [ + "gs", + "item_group_name", + "parent_item_group", + "is_group", + "image", + "column_break_5", + "defaults", + "item_group_defaults", + "sec_break_taxes", + "taxes", + "sb9", + "show_in_website", + "route", + "weightage", + "slideshow", + "description", + "website_specifications", + "lft", + "rgt", + "old_parent" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "gs", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "General Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "gs", + "fieldtype": "Section Break", + "label": "General Settings" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "item_group_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Item Group Name", - "length": 0, - "no_copy": 0, - "oldfieldname": "item_group_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "fieldname": "item_group_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Item Group Name", + "oldfieldname": "item_group_name", + "oldfieldtype": "Data", + "reqd": 1, "unique": 1 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "parent_item_group", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Parent Item Group", - "length": 0, - "no_copy": 0, - "oldfieldname": "parent_item_group", - "oldfieldtype": "Link", - "options": "Item Group", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "bold": 1, + "fieldname": "parent_item_group", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "in_list_view": 1, + "label": "Parent Item Group", + "oldfieldname": "parent_item_group", + "oldfieldtype": "Link", + "options": "Item Group" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "description": "Only leaf nodes are allowed in transaction", - "fieldname": "is_group", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Is Group", - "length": 0, - "no_copy": 0, - "oldfieldname": "is_group", - "oldfieldtype": "Select", - "options": "", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "bold": 1, + "default": "0", + "description": "Only leaf nodes are allowed in transaction", + "fieldname": "is_group", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Is Group", + "oldfieldname": "is_group", + "oldfieldtype": "Select" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "image", - "fieldtype": "Attach Image", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Image", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "image", + "fieldtype": "Attach Image", + "hidden": 1, + "label": "Image" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_5", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "column_break_5", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "defaults", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Defaults", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "defaults", + "fieldtype": "Section Break", + "label": "Defaults" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "item_group_defaults", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Item Group Defaults", - "length": 0, - "no_copy": 0, - "options": "Item Default", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "item_group_defaults", + "fieldtype": "Table", + "label": "Item Group Defaults", + "options": "Item Default" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "collapsible_depends_on": "", - "columns": 0, - "fieldname": "sec_break_taxes", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Item Tax", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "sec_break_taxes", + "fieldtype": "Section Break", + "label": "Item Tax" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "taxes", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Taxes", - "length": 0, - "no_copy": 0, - "options": "Item Tax", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "taxes", + "fieldtype": "Table", + "label": "Taxes", + "options": "Item Tax" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "sb9", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Website Settings", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "sb9", + "fieldtype": "Section Break", + "label": "Website Settings" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Check this if you want to show in website", - "fieldname": "show_in_website", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Show in Website", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "default": "0", + "description": "Check this if you want to show in website", + "fieldname": "show_in_website", + "fieldtype": "Check", + "label": "Show in Website" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "show_in_website", - "fieldname": "route", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Route", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "depends_on": "show_in_website", + "fieldname": "route", + "fieldtype": "Data", + "label": "Route", "unique": 1 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "weightage", - "fieldtype": "Int", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Weightage", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "weightage", + "fieldtype": "Int", + "label": "Weightage" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "show_in_website", - "description": "Show this slideshow at the top of the page", - "fieldname": "slideshow", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Slideshow", - "length": 0, - "no_copy": 0, - "options": "Website Slideshow", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "show_in_website", + "description": "Show this slideshow at the top of the page", + "fieldname": "slideshow", + "fieldtype": "Link", + "label": "Slideshow", + "options": "Website Slideshow" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "show_in_website", - "description": "HTML / Banner that will show on the top of product list.", - "fieldname": "description", - "fieldtype": "Text Editor", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Description", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "show_in_website", + "description": "HTML / Banner that will show on the top of product list.", + "fieldname": "description", + "fieldtype": "Text Editor", + "label": "Description" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "depends_on": "show_in_website", - "fieldname": "website_specifications", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Website Specifications", - "length": 0, - "no_copy": 0, - "options": "Item Website Specification", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "depends_on": "show_in_website", + "fieldname": "website_specifications", + "fieldtype": "Table", + "label": "Website Specifications", + "options": "Item Website Specification" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "lft", - "length": 0, - "no_copy": 1, - "oldfieldname": "lft", - "oldfieldtype": "Int", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "label": "lft", + "no_copy": 1, + "oldfieldname": "lft", + "oldfieldtype": "Int", + "print_hide": 1, + "search_index": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "rgt", - "length": 0, - "no_copy": 1, - "oldfieldname": "rgt", - "oldfieldtype": "Int", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "label": "rgt", + "no_copy": 1, + "oldfieldname": "rgt", + "oldfieldtype": "Int", + "print_hide": 1, + "search_index": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fieldname": "old_parent", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "old_parent", - "length": 0, - "no_copy": 1, - "oldfieldname": "old_parent", - "oldfieldtype": "Data", - "options": "Item Group", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "old_parent", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 1, + "label": "old_parent", + "no_copy": 1, + "oldfieldname": "old_parent", + "oldfieldtype": "Data", + "options": "Item Group", + "print_hide": 1, + "report_hide": 1 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-sitemap", - "idx": 1, - "image_field": "image", - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 3, - "modified": "2018-11-23 15:17:28.003933", - "modified_by": "Administrator", - "module": "Setup", - "name": "Item Group", - "name_case": "Title Case", - "owner": "Administrator", + ], + "icon": "fa fa-sitemap", + "idx": 1, + "image_field": "image", + "links": [], + "max_attachments": 3, + "modified": "2020-01-28 13:51:05.456014", + "modified_by": "Administrator", + "module": "Setup", + "name": "Item Group", + "name_case": "Title Case", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Stock Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 - }, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock Manager" + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Stock User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 - }, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Stock User" + }, { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Item Manager", - "set_user_permissions": 1, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Item Manager", + "set_user_permissions": 1, + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 - }, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales User" + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Purchase User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 - }, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Purchase User" + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Accounts User" } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "search_fields": "parent_item_group", - "show_name_in_global_search": 1, - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 -} + ], + "search_fields": "parent_item_group", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC" +} \ No newline at end of file diff --git a/erpnext/setup/doctype/sales_person/sales_person.json b/erpnext/setup/doctype/sales_person/sales_person.json index 27f79eb41f2..b05365d2ca9 100644 --- a/erpnext/setup/doctype/sales_person/sales_person.json +++ b/erpnext/setup/doctype/sales_person/sales_person.json @@ -1,579 +1,183 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, + "actions": [], "allow_import": 1, "allow_rename": 1, "autoname": "field:sales_person_name", - "beta": 0, "creation": "2013-01-10 16:34:24", - "custom": 0, "description": "All Sales Transactions can be tagged against multiple **Sales Persons** so that you can set and monitor targets.", - "docstatus": 0, "doctype": "DocType", "document_type": "Setup", - "editable_grid": 0, "engine": "InnoDB", + "field_order": [ + "name_and_employee_id", + "sales_person_name", + "parent_sales_person", + "commission_rate", + "is_group", + "enabled", + "cb0", + "employee", + "department", + "lft", + "rgt", + "old_parent", + "target_details_section_break", + "targets" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "name_and_employee_id", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Name and Employee ID", - "length": 0, - "no_copy": 0, - "options": "icon-user", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "icon-user" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "sales_person_name", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Sales Person Name", - "length": 0, - "no_copy": 0, "oldfieldname": "sales_person_name", "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, "unique": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "description": "Select company name first.", - "fetch_if_empty": 0, "fieldname": "parent_sales_person", "fieldtype": "Link", - "hidden": 0, "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Parent Sales Person", - "length": 0, - "no_copy": 0, "oldfieldname": "parent_sales_person", "oldfieldtype": "Link", - "options": "Sales Person", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Sales Person" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "commission_rate", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Commission Rate", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "print_hide": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, + "default": "0", "fieldname": "is_group", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Is Group", - "length": 0, - "no_copy": 0, "oldfieldname": "is_group", "oldfieldtype": "Select", - "options": "", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "reqd": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "1", - "fetch_if_empty": 0, "fieldname": "enabled", "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Enabled", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Enabled" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "cb0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldtype": "Column Break" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "employee", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Employee", - "length": 0, - "no_copy": 0, - "options": "Employee", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Employee" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fetch_from": "employee.department", - "fetch_if_empty": 0, "fieldname": "department", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Department", - "length": 0, - "no_copy": 0, "options": "Department", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "lft", "fieldtype": "Int", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "lft", - "length": 0, "no_copy": 1, "oldfieldname": "lft", "oldfieldtype": "Int", - "permlevel": 0, "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "rgt", "fieldtype": "Int", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "rgt", - "length": 0, "no_copy": 1, "oldfieldname": "rgt", "oldfieldtype": "Int", - "permlevel": 0, "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "old_parent", "fieldtype": "Data", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "old_parent", - "length": 0, "no_copy": 1, "oldfieldname": "old_parent", "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "print_hide": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "description": "Set targets Item Group-wise for this Sales Person.", - "fetch_if_empty": 0, "fieldname": "target_details_section_break", "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Sales Person Targets", - "length": 0, - "no_copy": 0, "oldfieldtype": "Section Break", - "options": "icon-bullseye", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "icon-bullseye" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "targets", "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Targets", - "length": 0, - "no_copy": 0, "oldfieldname": "target_details", "oldfieldtype": "Table", - "options": "Target Detail", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Target Detail" } ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, "icon": "icon-user", "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2019-03-22 16:26:01.706129", + "links": [], + "modified": "2020-01-28 13:50:31.891050", "modified_by": "Administrator", "module": "Setup", "name": "Sales Person", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Sales Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "role": "Sales Manager" }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Sales User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "role": "Sales User" }, { - "amend": 0, - "cancel": 0, "create": 1, "delete": 1, "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, "role": "Sales Master Manager", - "set_user_permissions": 0, "share": 1, - "submit": 0, "write": 1 } ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, "search_fields": "parent_sales_person", "show_name_in_global_search": 1, - "sort_order": "ASC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + "sort_field": "modified", + "sort_order": "ASC" } \ No newline at end of file diff --git a/erpnext/setup/doctype/territory/territory.json b/erpnext/setup/doctype/territory/territory.json index beadb483779..91a3dda2bb0 100644 --- a/erpnext/setup/doctype/territory/territory.json +++ b/erpnext/setup/doctype/territory/territory.json @@ -1,487 +1,173 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 1, - "allow_rename": 1, - "autoname": "field:territory_name", - "beta": 0, - "creation": "2013-01-10 16:34:24", - "custom": 0, - "description": "Classification of Customers by region", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Setup", - "editable_grid": 0, + "actions": [], + "allow_import": 1, + "allow_rename": 1, + "autoname": "field:territory_name", + "creation": "2013-01-10 16:34:24", + "description": "Classification of Customers by region", + "doctype": "DocType", + "document_type": "Setup", + "engine": "InnoDB", + "field_order": [ + "territory_name", + "parent_territory", + "is_group", + "cb0", + "territory_manager", + "lft", + "rgt", + "old_parent", + "target_details_section_break", + "targets" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "territory_name", - "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Territory Name", - "length": 0, - "no_copy": 1, - "oldfieldname": "territory_name", - "oldfieldtype": "Data", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 1, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, + "fieldname": "territory_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Territory Name", + "no_copy": 1, + "oldfieldname": "territory_name", + "oldfieldtype": "Data", + "reqd": 1, "unique": 1 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "description": "", - "fetch_if_empty": 0, - "fieldname": "parent_territory", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Parent Territory", - "length": 0, - "no_copy": 0, - "oldfieldname": "parent_territory", - "oldfieldtype": "Link", - "options": "Territory", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "bold": 1, + "fieldname": "parent_territory", + "fieldtype": "Link", + "ignore_user_permissions": 1, + "in_list_view": 1, + "label": "Parent Territory", + "oldfieldname": "parent_territory", + "oldfieldtype": "Link", + "options": "Territory" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 1, - "collapsible": 0, - "columns": 0, - "description": "", - "fetch_if_empty": 0, - "fieldname": "is_group", - "fieldtype": "Check", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Is Group", - "length": 0, - "no_copy": 0, - "oldfieldname": "is_group", - "oldfieldtype": "Select", - "options": "", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "bold": 1, + "default": "0", + "fieldname": "is_group", + "fieldtype": "Check", + "in_list_view": 1, + "label": "Is Group", + "oldfieldname": "is_group", + "oldfieldtype": "Select" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "cb0", - "fieldtype": "Column Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "length": 0, - "no_copy": 0, - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "cb0", + "fieldtype": "Column Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "For reference", - "fetch_if_empty": 0, - "fieldname": "territory_manager", - "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Territory Manager", - "length": 0, - "no_copy": 0, - "oldfieldname": "territory_manager", - "oldfieldtype": "Link", - "options": "Sales Person", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "description": "For reference", + "fieldname": "territory_manager", + "fieldtype": "Link", + "in_list_view": 1, + "label": "Territory Manager", + "oldfieldname": "territory_manager", + "oldfieldtype": "Link", + "options": "Sales Person", + "search_index": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "lft", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "lft", - "length": 0, - "no_copy": 1, - "oldfieldname": "lft", - "oldfieldtype": "Int", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "lft", + "fieldtype": "Int", + "hidden": 1, + "label": "lft", + "no_copy": 1, + "oldfieldname": "lft", + "oldfieldtype": "Int", + "print_hide": 1, + "search_index": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "rgt", - "fieldtype": "Int", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "rgt", - "length": 0, - "no_copy": 1, - "oldfieldname": "rgt", - "oldfieldtype": "Int", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "rgt", + "fieldtype": "Int", + "hidden": 1, + "label": "rgt", + "no_copy": 1, + "oldfieldname": "rgt", + "oldfieldtype": "Int", + "print_hide": 1, + "search_index": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "", - "fetch_if_empty": 0, - "fieldname": "old_parent", - "fieldtype": "Link", - "hidden": 1, - "ignore_user_permissions": 1, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "old_parent", - "length": 0, - "no_copy": 1, - "oldfieldname": "old_parent", - "oldfieldtype": "Data", - "options": "Territory", - "permlevel": 0, - "print_hide": 1, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 1, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "fieldname": "old_parent", + "fieldtype": "Link", + "hidden": 1, + "ignore_user_permissions": 1, + "label": "old_parent", + "no_copy": 1, + "oldfieldname": "old_parent", + "oldfieldtype": "Data", + "options": "Territory", + "print_hide": 1, + "report_hide": 1 + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.", - "fetch_if_empty": 0, - "fieldname": "target_details_section_break", - "fieldtype": "Section Break", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Territory Targets", - "length": 0, - "no_copy": 0, - "oldfieldtype": "Section Break", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 - }, + "description": "Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.", + "fieldname": "target_details_section_break", + "fieldtype": "Section Break", + "label": "Territory Targets", + "oldfieldtype": "Section Break" + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, - "fieldname": "targets", - "fieldtype": "Table", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Targets", - "length": 0, - "no_copy": 0, - "oldfieldname": "target_details", - "oldfieldtype": "Table", - "options": "Target Detail", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "fieldname": "targets", + "fieldtype": "Table", + "label": "Targets", + "oldfieldname": "target_details", + "oldfieldtype": "Table", + "options": "Target Detail" } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "fa fa-map-marker", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2019-03-21 16:26:58.581431", - "modified_by": "Administrator", - "module": "Setup", - "name": "Territory", - "name_case": "Title Case", - "owner": "Administrator", + ], + "icon": "fa fa-map-marker", + "idx": 1, + "links": [], + "modified": "2020-01-28 13:49:31.905800", + "modified_by": "Administrator", + "module": "Setup", + "name": "Territory", + "name_case": "Title Case", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 1, - "if_owner": 0, - "import": 1, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales Master Manager", - "set_user_permissions": 1, - "share": 1, - "submit": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "import": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales Master Manager", + "set_user_permissions": 1, + "share": 1, "write": 1 - }, + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 - }, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales Manager" + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 1, - "role": "Sales User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 - }, + "email": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Sales User" + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Stock User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 - }, + "read": 1, + "role": "Stock User" + }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, - "read": 1, - "report": 0, - "role": "Maintenance User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "read": 1, + "role": "Maintenance User" } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "search_fields": "parent_territory,territory_manager", - "show_name_in_global_search": 1, - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + ], + "search_fields": "parent_territory,territory_manager", + "show_name_in_global_search": 1, + "sort_field": "modified", + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json index 646725956dc..2bf1ed89838 100644 --- a/erpnext/stock/doctype/warehouse/warehouse.json +++ b/erpnext/stock/doctype/warehouse/warehouse.json @@ -1,10 +1,12 @@ { + "actions": [], "allow_import": 1, "allow_rename": 1, "creation": "2013-03-07 18:50:32", "description": "A logical Warehouse against which stock entries are made.", "doctype": "DocType", "document_type": "Setup", + "engine": "InnoDB", "field_order": [ "warehouse_detail", "warehouse_name", @@ -226,7 +228,8 @@ ], "icon": "fa fa-building", "idx": 1, - "modified": "2019-05-22 11:17:23.357490", + "links": [], + "modified": "2020-01-28 13:50:59.368846", "modified_by": "Administrator", "module": "Stock", "name": "Warehouse", @@ -279,8 +282,8 @@ "role": "Manufacturing User" } ], - "quick_entry": 1, "show_name_in_global_search": 1, + "sort_field": "modified", "sort_order": "DESC", "title_field": "warehouse_name" } \ No newline at end of file From ade2c36123def1ec8f01aa1487bea36405de83ac Mon Sep 17 00:00:00 2001 From: Deepesh Garg <42651287+deepeshgarg007@users.noreply.github.com> Date: Mon, 3 Feb 2020 18:54:35 +0530 Subject: [PATCH 21/43] fix: Unable to submit landed cost voucher (#20494) * fix: Unable to submit landed cost voucher * fix: Test case for multiple landed cost voucher against a Purchase receipt * fix: Test Case --- .../test_landed_cost_voucher.py | 70 +++++++++++++++++++ .../purchase_receipt/purchase_receipt.py | 17 ++--- 2 files changed, 75 insertions(+), 12 deletions(-) diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py index 988cf52ed05..62d369cb9d9 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py @@ -162,6 +162,76 @@ class TestLandedCostVoucher(unittest.TestCase): self.assertEqual(lcv.items[0].applicable_charges, 41.07) self.assertEqual(lcv.items[2].applicable_charges, 41.08) + def test_multiple_landed_cost_voucher_against_pr(self): + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", + supplier_warehouse = "Stores - TCP1", do_not_save=True) + + pr.append("items", { + "item_code": "_Test Item", + "warehouse": "Stores - TCP1", + "cost_center": "Main - TCP1", + "qty": 5, + "rate": 100 + }) + + pr.submit() + + lcv1 = make_landed_cost_voucher(receipt_document_type = 'Purchase Receipt', + receipt_document=pr.name, charges=100, do_not_save=True) + + lcv1.insert() + lcv1.set('items', [ + lcv1.get('items')[0] + ]) + distribute_landed_cost_on_items(lcv1) + + lcv1.submit() + + lcv2 = make_landed_cost_voucher(receipt_document_type = 'Purchase Receipt', + receipt_document=pr.name, charges=100, do_not_save=True) + + lcv2.insert() + lcv2.set('items', [ + lcv2.get('items')[1] + ]) + distribute_landed_cost_on_items(lcv2) + + lcv2.submit() + + pr.load_from_db() + + self.assertEqual(pr.items[0].landed_cost_voucher_amount, 100) + self.assertEqual(pr.items[1].landed_cost_voucher_amount, 100) + +def make_landed_cost_voucher(** args): + args = frappe._dict(args) + ref_doc = frappe.get_doc(args.receipt_document_type, args.receipt_document) + + lcv = frappe.new_doc('Landed Cost Voucher') + lcv.company = '_Test Company' + lcv.distribute_charges_based_on = 'Amount' + + lcv.set('purchase_receipts', [{ + "receipt_document_type": args.receipt_document_type, + "receipt_document": args.receipt_document, + "supplier": ref_doc.supplier, + "posting_date": ref_doc.posting_date, + "grand_total": ref_doc.grand_total + }]) + + lcv.set("taxes", [{ + "description": "Shipping Charges", + "expense_account": "Expenses Included In Valuation - TCP1", + "amount": args.charges + }]) + + if not args.do_not_save: + lcv.insert() + if not args.do_not_submit: + lcv.submit() + + return lcv + def submit_landed_cost_voucher(receipt_document_type, receipt_document, charges=50): ref_doc = frappe.get_doc(receipt_document_type, receipt_document) diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 09adb567513..fb123b9c1fa 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -349,7 +349,7 @@ class PurchaseReceipt(BuyingController): if warehouse_with_no_account: frappe.msgprint(_("No accounting entries for the following warehouses") + ": \n" + "\n".join(warehouse_with_no_account)) - + return process_gl_map(gl_entries) def get_asset_gl_entry(self, gl_entries): @@ -616,23 +616,16 @@ def get_item_account_wise_additional_cost(purchase_document): if not landed_cost_vouchers: return - - total_item_cost = 0 + item_account_wise_cost = {} - item_cost_allocated = [] for lcv in landed_cost_vouchers: - landed_cost_voucher_doc = frappe.get_cached_doc("Landed Cost Voucher", lcv.parent) + landed_cost_voucher_doc = frappe.get_doc("Landed Cost Voucher", lcv.parent) based_on_field = frappe.scrub(landed_cost_voucher_doc.distribute_charges_based_on) + total_item_cost = 0 for item in landed_cost_voucher_doc.items: - if item.purchase_receipt_item not in item_cost_allocated: - total_item_cost += item.get(based_on_field) - item_cost_allocated.append(item.purchase_receipt_item) - - for lcv in landed_cost_vouchers: - landed_cost_voucher_doc = frappe.get_cached_doc("Landed Cost Voucher", lcv.parent) - based_on_field = frappe.scrub(landed_cost_voucher_doc.distribute_charges_based_on) + total_item_cost += item.get(based_on_field) for item in landed_cost_voucher_doc.items: if item.receipt_document == purchase_document: From 0f90b870fb7d77a4ad68485f8ace85508860f2c6 Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 5 Feb 2020 12:12:47 +0530 Subject: [PATCH 22/43] fix: SQL query in financial statements --- .../accounts/report/financial_statements.py | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index 57e8e0ea8fc..75433a135f3 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -348,40 +348,42 @@ def set_gl_entries_by_account( additional_conditions = get_additional_conditions(from_date, ignore_closing_entries, filters) accounts = frappe.db.sql_list("""select name from `tabAccount` - where lft >= %s and rgt <= %s""", (root_lft, root_rgt)) - additional_conditions += " and account in ({})"\ - .format(", ".join([frappe.db.escape(d) for d in accounts])) + where lft >= %s and rgt <= %s and company = %s""", (root_lft, root_rgt, company)) - gl_filters = { - "company": company, - "from_date": from_date, - "to_date": to_date, - "finance_book": cstr(filters.get("finance_book")) - } + if accounts: + additional_conditions += " and account in ({})"\ + .format(", ".join([frappe.db.escape(d) for d in accounts])) - if filters.get("include_default_book_entries"): - gl_filters["company_fb"] = frappe.db.get_value("Company", - company, 'default_finance_book') + gl_filters = { + "company": company, + "from_date": from_date, + "to_date": to_date, + "finance_book": cstr(filters.get("finance_book")) + } - for key, value in filters.items(): - if value: - gl_filters.update({ - key: value - }) + if filters.get("include_default_book_entries"): + gl_filters["company_fb"] = frappe.db.get_value("Company", + company, 'default_finance_book') - gl_entries = frappe.db.sql("""select posting_date, account, debit, credit, is_opening, fiscal_year, debit_in_account_currency, credit_in_account_currency, account_currency from `tabGL Entry` - where company=%(company)s - {additional_conditions} - and posting_date <= %(to_date)s - order by account, posting_date""".format(additional_conditions=additional_conditions), gl_filters, as_dict=True) #nosec + for key, value in filters.items(): + if value: + gl_filters.update({ + key: value + }) - if filters and filters.get('presentation_currency'): - convert_to_presentation_currency(gl_entries, get_currency(filters)) + gl_entries = frappe.db.sql("""select posting_date, account, debit, credit, is_opening, fiscal_year, debit_in_account_currency, credit_in_account_currency, account_currency from `tabGL Entry` + where company=%(company)s + {additional_conditions} + and posting_date <= %(to_date)s + order by account, posting_date""".format(additional_conditions=additional_conditions), gl_filters, as_dict=True) #nosec - for entry in gl_entries: - gl_entries_by_account.setdefault(entry.account, []).append(entry) + if filters and filters.get('presentation_currency'): + convert_to_presentation_currency(gl_entries, get_currency(filters)) - return gl_entries_by_account + for entry in gl_entries: + gl_entries_by_account.setdefault(entry.account, []).append(entry) + + return gl_entries_by_account def get_additional_conditions(from_date, ignore_closing_entries, filters): From b4a0c773ae5c8b6ec37edc64073175f5863981c1 Mon Sep 17 00:00:00 2001 From: "Parth J. Kharwar" Date: Wed, 5 Feb 2020 15:00:58 +0530 Subject: [PATCH 23/43] fix: half day leave date value reset (#20488) * fix: full day leaves not tagged as half day in attendance * chore: code cleanup for half day date value set --- .../hr/doctype/leave_application/leave_application.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/erpnext/hr/doctype/leave_application/leave_application.js b/erpnext/hr/doctype/leave_application/leave_application.js index 174641048b8..df4cf71b776 100755 --- a/erpnext/hr/doctype/leave_application/leave_application.js +++ b/erpnext/hr/doctype/leave_application/leave_application.js @@ -104,11 +104,16 @@ frappe.ui.form.on("Leave Application", { }, half_day: function(frm) { - if (frm.doc.from_date == frm.doc.to_date) { - frm.set_value("half_day_date", frm.doc.from_date); + if (frm.doc.half_day) { + if (frm.doc.from_date == frm.doc.to_date) { + frm.set_value("half_day_date", frm.doc.from_date); + } + else { + frm.trigger("half_day_datepicker"); + } } else { - frm.trigger("half_day_datepicker"); + frm.set_value("half_day_date", ""); } frm.trigger("calculate_total_days"); }, From 67dbeee7b28fd1f1fc8a349f4c1a01f2340c4e2c Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Wed, 5 Feb 2020 09:38:05 +0530 Subject: [PATCH 24/43] fix: Add total row --- .../item_wise_purchase_register.py | 12 +++++--- .../item_wise_sales_register.py | 28 +++++++++++++++---- 2 files changed, 30 insertions(+), 10 deletions(-) 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 3a5a4548f5a..8b6359c134d 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 @@ -6,7 +6,7 @@ import frappe, erpnext from frappe import _ from frappe.utils import flt from erpnext.accounts.report.item_wise_sales_register.item_wise_sales_register import (get_tax_accounts, - get_grand_total, add_total_row, get_display_value, get_group_by_and_display_fields, update_total_row, + get_grand_total, add_total_row, get_display_value, get_group_by_and_display_fields, add_sub_total_row, get_group_by_conditions) def execute(filters=None): @@ -29,6 +29,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum data = [] total_row_map = {} + skip_total_row = 0 prev_group_by_value = '' if filters.get('group_by'): @@ -96,8 +97,8 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum row.update({'percent_gt': flt(row['total']/grand_total) * 100}) group_by_field, subtotal_display_field = get_group_by_and_display_fields(filters) data, prev_group_by_value = add_total_row(data, filters, prev_group_by_value, d, total_row_map, - group_by_field, subtotal_display_field, grand_total) - update_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns) + group_by_field, subtotal_display_field, grand_total, tax_columns) + add_sub_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns) data.append(row) @@ -106,8 +107,11 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) data.append(total_row) data.append({}) + add_sub_total_row(total_row, total_row_map, 'total_row', tax_columns) + data.append(total_row_map.get('total_row')) + skip_total_row = 1 - return columns, data + return columns, data, None, None, None, skip_total_row def get_columns(additional_table_columns, filters): 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 dc900f09e36..ad2e12f8239 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 @@ -28,6 +28,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum data = [] total_row_map = {} + skip_total_row = 0 prev_group_by_value = '' if filters.get('group_by'): @@ -105,7 +106,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum row.update({'percent_gt': flt(row['total']/grand_total) * 100}) group_by_field, subtotal_display_field = get_group_by_and_display_fields(filters) data, prev_group_by_value = add_total_row(data, filters, prev_group_by_value, d, total_row_map, - group_by_field, subtotal_display_field, grand_total) + group_by_field, subtotal_display_field, grand_total, tax_columns) add_sub_total_row(row, total_row_map, d.get(group_by_field, ''), tax_columns) data.append(row) @@ -115,8 +116,11 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) data.append(total_row) data.append({}) - - return columns, data + add_sub_total_row(total_row, total_row_map, 'total_row', tax_columns) + data.append(total_row_map.get('total_row')) + skip_total_row = 1 + + return columns, data, None, None, None, skip_total_row def get_columns(additional_table_columns, filters): columns = [] @@ -541,13 +545,13 @@ def get_tax_accounts(item_list, columns, company_currency, return itemised_tax, tax_columns def add_total_row(data, filters, prev_group_by_value, item, total_row_map, - group_by_field, subtotal_display_field, grand_total): + group_by_field, subtotal_display_field, grand_total, tax_columns): if prev_group_by_value != item.get(group_by_field, ''): if prev_group_by_value: total_row = total_row_map.get(prev_group_by_value) - total_row['percent_gt'] = flt(total_row['total']/grand_total * 100) data.append(total_row) data.append({}) + add_sub_total_row(total_row, total_row_map, 'total_row', tax_columns) prev_group_by_value = item.get(group_by_field, '') @@ -557,7 +561,18 @@ def add_total_row(data, filters, prev_group_by_value, item, total_row_map, 'amount': 0.0, 'bold': 1, 'total_tax': 0.0, - 'total': 0.0 + 'total': 0.0, + 'percent_gt': 0.0 + }) + + total_row_map.setdefault('total_row', { + subtotal_display_field: "Total", + 'stock_qty': 0.0, + 'amount': 0.0, + 'bold': 1, + 'total_tax': 0.0, + 'total': 0.0, + 'percent_gt': 0.0 }) return data, prev_group_by_value @@ -600,6 +615,7 @@ def add_sub_total_row(item, total_row_map, group_by_value, tax_columns): total_row['amount'] += item['amount'] total_row['total_tax'] += item['total_tax'] total_row['total'] += item['total'] + total_row['percent_gt'] += item['percent_gt'] for tax in tax_columns: total_row.setdefault(frappe.scrub(tax + ' Amount'), 0.0) From 8e0a9e8748665aabf45105732bf70de4e1807192 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Wed, 5 Feb 2020 16:17:16 +0530 Subject: [PATCH 25/43] fix: unsupported operand type(s) for += 'int' and 'NoneType' --- erpnext/stock/doctype/pick_list/pick_list.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py index c4d8c41ebb7..7ed998f979a 100644 --- a/erpnext/stock/doctype/pick_list/pick_list.py +++ b/erpnext/stock/doctype/pick_list/pick_list.py @@ -74,13 +74,13 @@ class PickList(Document): if item_map.get(key): item_map[key].qty += item.qty - item_map[key].stock_qty += item.stock_qty + item_map[key].stock_qty += flt(item.stock_qty) else: item_map[key] = item # maintain count of each item (useful to limit get query) self.item_count_map.setdefault(item_code, 0) - self.item_count_map[item_code] += item.stock_qty + self.item_count_map[item_code] += flt(item.stock_qty) return item_map.values() From 9f58e59a2c8a3ab723bd9f2973ed31ac9e80fe72 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 29 Jan 2020 21:41:56 +0530 Subject: [PATCH 26/43] fix: Label and UX fixes while creating payment entry against customer --- erpnext/accounts/doctype/bank_account/bank_account.json | 6 ++++-- erpnext/accounts/doctype/payment_entry/payment_entry.py | 4 +++- erpnext/selling/doctype/customer/customer.js | 8 ++++++++ erpnext/selling/doctype/customer/customer.json | 6 ++++-- erpnext/selling/doctype/customer/customer.py | 6 ++++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/bank_account/bank_account.json b/erpnext/accounts/doctype/bank_account/bank_account.json index 8e30b8555cb..c8ae26d9f2c 100644 --- a/erpnext/accounts/doctype/bank_account/bank_account.json +++ b/erpnext/accounts/doctype/bank_account/bank_account.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_import": 1, "allow_rename": 1, "creation": "2017-05-29 21:35:13.136357", @@ -82,7 +83,7 @@ "default": "0", "fieldname": "is_default", "fieldtype": "Check", - "label": "Is the Default Account" + "label": "Is Default Account" }, { "default": "0", @@ -211,7 +212,8 @@ "read_only": 1 } ], - "modified": "2019-10-02 01:34:12.417601", + "links": [], + "modified": "2020-01-29 20:42:26.458316", "modified_by": "Administrator", "module": "Accounts", "name": "Bank Account", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 214d6088667..d65e5640263 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -102,7 +102,9 @@ class PaymentEntry(AccountsController): self.bank = bank_data.bank self.bank_account_no = bank_data.bank_account_no - self.set(field, bank_data.account) + + if not self.get(field): + self.set(field, bank_data.account) def validate_allocated_amount(self): for d in self.get("references"): diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js index 30220614e9b..0a9f9b8f0a7 100644 --- a/erpnext/selling/doctype/customer/customer.js +++ b/erpnext/selling/doctype/customer/customer.js @@ -55,6 +55,14 @@ frappe.ui.form.on("Customer", { } } }) + + frm.set_query('default_bank_account', function(c) { + return { + filters: { + 'is_company_account': 1 + } + } + }); }, customer_primary_address: function(frm){ if(frm.doc.customer_primary_address){ diff --git a/erpnext/selling/doctype/customer/customer.json b/erpnext/selling/doctype/customer/customer.json index 250973b7497..89ce325a847 100644 --- a/erpnext/selling/doctype/customer/customer.json +++ b/erpnext/selling/doctype/customer/customer.json @@ -1,4 +1,5 @@ { + "actions": [], "allow_events_in_timeline": 1, "allow_import": 1, "allow_rename": 1, @@ -122,7 +123,7 @@ { "fieldname": "default_bank_account", "fieldtype": "Link", - "label": "Default Bank Account", + "label": "Default Company Bank Account", "options": "Bank Account" }, { @@ -470,7 +471,8 @@ "icon": "fa fa-user", "idx": 363, "image_field": "image", - "modified": "2020-01-24 15:06:03.483799", + "links": [], + "modified": "2020-01-29 20:36:37.879581", "modified_by": "Administrator", "module": "Selling", "name": "Customer", diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py index 6ee02190bad..3248c998b60 100644 --- a/erpnext/selling/doctype/customer/customer.py +++ b/erpnext/selling/doctype/customer/customer.py @@ -54,6 +54,7 @@ class Customer(TransactionBase): self.validate_credit_limit_on_change() self.set_loyalty_program() self.check_customer_group_change() + self.validate_default_bank_account() # set loyalty program tier if frappe.db.exists('Customer', self.name): @@ -72,6 +73,11 @@ class Customer(TransactionBase): if self.customer_group != frappe.db.get_value('Customer', self.name, 'customer_group'): frappe.flags.customer_group_changed = True + def validate_default_bank_account(self): + if self.default_bank_account: + is_company_account = frappe.db.get_value('Bank Account', self.default_bank_account, 'is_company_account') + frappe.throw(_("{0} is not a company bank account").format(frappe.bold(self.default_bank_account))) + def on_update(self): self.validate_name_with_customer_group() self.create_primary_contact() From 3ed574532de1e034637678b7a85490f94cab4c48 Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Wed, 29 Jan 2020 21:45:17 +0530 Subject: [PATCH 27/43] fix: filter --- erpnext/selling/doctype/customer/customer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js index 0a9f9b8f0a7..6db4102a7bf 100644 --- a/erpnext/selling/doctype/customer/customer.js +++ b/erpnext/selling/doctype/customer/customer.js @@ -56,7 +56,7 @@ frappe.ui.form.on("Customer", { } }) - frm.set_query('default_bank_account', function(c) { + frm.set_query('default_bank_account', function() { return { filters: { 'is_company_account': 1 From d9f8347fc80455d41a44d62097f6ae91c226b47a Mon Sep 17 00:00:00 2001 From: thefalconx33 Date: Wed, 5 Feb 2020 16:40:58 +0530 Subject: [PATCH 28/43] fix: typo; serial no doesn't have amc start date --- .../doctype/maintenance_schedule/maintenance_schedule.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py index 94d85f77ef4..c5bc92dcc17 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py @@ -193,7 +193,7 @@ class MaintenanceSchedule(TransactionBase): if sr_details.amc_expiry_date and getdate(sr_details.amc_expiry_date) >= getdate(amc_start_date): throw(_("Serial No {0} is under maintenance contract upto {1}") - .format(serial_no, sr_details.amc_start_date)) + .format(serial_no, sr_details.amc_expiry_date)) if not sr_details.warehouse and sr_details.delivery_date and \ getdate(sr_details.delivery_date) >= getdate(amc_start_date): From 0eb9f7408e59a08e2cacca21259a156033868bad Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 6 Feb 2020 14:34:11 +0530 Subject: [PATCH 29/43] fix: Procurement Tracker report not working --- .../report/procurement_tracker/procurement_tracker.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/erpnext/buying/report/procurement_tracker/procurement_tracker.py b/erpnext/buying/report/procurement_tracker/procurement_tracker.py index 48295bee26a..866bf0c7332 100644 --- a/erpnext/buying/report/procurement_tracker/procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/procurement_tracker.py @@ -141,13 +141,13 @@ def get_conditions(filters): conditions = "" if filters.get("company"): - conditions += " AND company='%s'"% filters.get('company') + conditions += " AND company=%s"% frappe.db.escape(filters.get('company')) if filters.get("cost_center") or filters.get("project"): conditions += """ - AND (cost_center='%s' - OR project='%s') - """% (filters.get('cost_center'), filters.get('project')) + AND (cost_center=%s + OR project=%s) + """% (frappe.db.escape(filters.get('cost_center')), frappe.db.escape(filters.get('project'))) if filters.get("from_date"): conditions += " AND transaction_date>=%s"% filters.get('from_date') From bdfa2ff33ac56620964f24e0f058866a82413b4d Mon Sep 17 00:00:00 2001 From: Deepesh Garg Date: Fri, 7 Feb 2020 11:05:33 +0530 Subject: [PATCH 30/43] fix: Do not calculate total for rate --- .../report/item_wise_sales_register/item_wise_sales_register.py | 2 -- 1 file changed, 2 deletions(-) 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 dc900f09e36..524f949a334 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 @@ -603,8 +603,6 @@ def add_sub_total_row(item, total_row_map, group_by_value, tax_columns): for tax in tax_columns: total_row.setdefault(frappe.scrub(tax + ' Amount'), 0.0) - total_row.setdefault(frappe.scrub(tax + ' Rate'), 0.0) - total_row[frappe.scrub(tax + ' Rate')] += flt(item[frappe.scrub(tax + ' Rate')]) total_row[frappe.scrub(tax + ' Amount')] += flt(item[frappe.scrub(tax + ' Amount')]) From 7027584391979b25f84b4a504c44d60aa3226411 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 7 Feb 2020 14:38:25 +0530 Subject: [PATCH 31/43] fix: time out error while submitting the purchase receipt which has more than 100 serial nos --- .../purchase_receipt/test_purchase_receipt.py | 24 +++++++ erpnext/stock/doctype/serial_no/serial_no.py | 66 ++++++++++--------- 2 files changed, 58 insertions(+), 32 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index c80b9bd04bb..707750413e0 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -262,6 +262,30 @@ class TestPurchaseReceipt(unittest.TestCase): self.assertEqual(pr2.per_billed, 80) self.assertEqual(pr2.status, "To Bill") + def test_serial_no_against_purchase_receipt(self): + from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos + + item_code = "Test Manual Created Serial No" + if not frappe.db.exists("Item", item_code): + item = make_item(item_code, dict(has_serial_no=1)) + + serial_no = random_string(5) + pr_doc = make_purchase_receipt(item_code=item_code, + qty=1, serial_no = serial_no) + + self.assertEqual(serial_no, frappe.db.get_value("Serial No", + {"purchase_document_type": "Purchase Receipt", "purchase_document_no": pr_doc.name}, "name")) + + item_code = "Test Auto Created Serial No" + if not frappe.db.exists("Item", item_code): + item = make_item(item_code, dict(has_serial_no=1, serial_no_series="KLJL.###")) + + new_pr_doc = make_purchase_receipt(item_code=item_code, qty=1) + + serial_no = get_serial_nos(new_pr_doc[0].serial_no)[0] + self.assertEqual(serial_no, frappe.db.get_value("Serial No", + {"purchase_document_type": "Purchase Receipt", "purchase_document_no": new_pr_doc.name}, "name")) + def test_not_accept_duplicate_serial_no(self): from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 19eb398130c..855ab7a9662 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -29,13 +29,12 @@ class SerialNo(StockController): self.via_stock_ledger = False def validate(self): - if self.get("__islocal") and self.warehouse: + if self.get("__islocal") and self.warehouse and not self.via_stock_ledger: frappe.throw(_("New Serial No cannot have Warehouse. Warehouse must be set by Stock Entry or Purchase Receipt"), SerialNoCannotCreateDirectError) self.set_maintenance_status() self.validate_warehouse() self.validate_item() - self.on_stock_ledger_entry() def set_maintenance_status(self): if not self.warranty_expiry_date and not self.amc_expiry_date: @@ -68,7 +67,7 @@ class SerialNo(StockController): """ Validate whether serial no is required for this item """ - item = frappe.get_doc("Item", self.item_code) + item = frappe.get_cached_doc("Item", self.item_code) if item.has_serial_no!=1: frappe.throw(_("Item {0} is not setup for Serial Nos. Check Item master").format(self.item_code)) @@ -117,9 +116,9 @@ class SerialNo(StockController): "warranty_expiry_date"): self.set(fieldname, None) - def get_last_sle(self): + def get_last_sle(self, serial_no=None): entries = {} - sle_dict = self.get_stock_ledger_entries() + sle_dict = self.get_stock_ledger_entries(serial_no) if sle_dict: if sle_dict.get("incoming", []): entries["purchase_sle"] = sle_dict["incoming"][0] @@ -132,13 +131,28 @@ class SerialNo(StockController): return entries - def get_stock_ledger_entries(self): + def get_stock_ledger_entries(self, serial_no=None): sle_dict = {} - for sle in frappe.db.sql("""select * from `tabStock Ledger Entry` - where serial_no like %s and item_code=%s and ifnull(is_cancelled, 'No')='No' - order by posting_date desc, posting_time desc, creation desc""", - ("%%%s%%" % self.name, self.item_code), as_dict=1): - if self.name.upper() in get_serial_nos(sle.serial_no): + if not serial_no: + serial_no = self.name + + for sle in frappe.db.sql(""" + SELECT voucher_type, voucher_no, + posting_date, posting_time, incoming_rate, actual_qty, serial_no + FROM + `tabStock Ledger Entry` + WHERE + item_code=%s AND company = %s AND ifnull(is_cancelled, 'No')='No' + AND (serial_no = %s + OR serial_no like %s + OR serial_no like %s + OR serial_no like %s + ) + ORDER BY + posting_date desc, posting_time desc, creation desc""", + (self.item_code, self.company, + serial_no, serial_no+'\n%', '%\n'+serial_no, '%\n'+serial_no+'\n%'), as_dict=1): + if serial_no.upper() in get_serial_nos(sle.serial_no): if cint(sle.actual_qty) > 0: sle_dict.setdefault("incoming", []).append(sle) else: @@ -178,12 +192,11 @@ class SerialNo(StockController): where name=%s""" % (dt[0], '%s', '%s'), ('\n'.join(list(serial_nos)), item[0])) - def on_stock_ledger_entry(self): - if self.via_stock_ledger and not self.get("__islocal"): - last_sle = self.get_last_sle() - self.set_purchase_details(last_sle.get("purchase_sle")) - self.set_sales_details(last_sle.get("delivery_sle")) - self.set_maintenance_status() + def update_serial_no_reference(self, serial_no=None): + last_sle = self.get_last_sle(serial_no) + self.set_purchase_details(last_sle.get("purchase_sle")) + self.set_sales_details(last_sle.get("delivery_sle")) + self.set_maintenance_status() def process_serial_no(sle): item_det = get_item_details(sle.item_code) @@ -387,27 +400,16 @@ def get_serial_nos(serial_no): def make_serial_no(serial_no, args): sr = frappe.new_doc("Serial No") - sr.warehouse = None - sr.dont_update_if_missing.append("warehouse") - sr.flags.ignore_permissions = True sr.serial_no = serial_no sr.item_code = args.get('item_code') sr.company = args.get('company') sr.batch_no = args.get('batch_no') sr.via_stock_ledger = args.get('via_stock_ledger') or True - sr.asset = args.get('asset') - sr.location = args.get('location') - + sr.warehouse = args.get('warehouse') - if args.get('purchase_document_type'): - sr.purchase_document_type = args.get('purchase_document_type') - sr.purchase_document_no = args.get('purchase_document_no') - sr.supplier = args.get('supplier') - - sr.insert() - if args.get('warehouse'): - sr.warehouse = args.get('warehouse') - sr.save() + sr.validate_item() + sr.update_serial_no_reference(serial_no) + sr.db_insert() return sr.name From bbeacb9acf06ac319c9e30d2f2d3ba39cecb6903 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 7 Feb 2020 14:56:58 +0530 Subject: [PATCH 32/43] fix: incorrect warehouse for material request in production plan --- erpnext/manufacturing/doctype/production_plan/production_plan.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py index 10a8d8fc9bd..76202e5a6f3 100644 --- a/erpnext/manufacturing/doctype/production_plan/production_plan.py +++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py @@ -625,7 +625,6 @@ def get_items_for_material_requests(doc, ignore_existing_ordered_qty=None): for data in po_items: planned_qty = data.get('required_qty') or data.get('planned_qty') ignore_existing_ordered_qty = data.get('ignore_existing_ordered_qty') or ignore_existing_ordered_qty - warehouse = data.get("warehouse") or warehouse item_details = {} if data.get("bom") or data.get("bom_no"): From a9205adfbdc42dcc10afa1737425f68483ca9357 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Fri, 7 Feb 2020 15:36:38 +0530 Subject: [PATCH 33/43] fix: test cases --- .../doctype/purchase_receipt/test_purchase_receipt.py | 11 +++++++---- erpnext/stock/doctype/serial_no/serial_no.py | 1 + 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py index 707750413e0..aa09d3bfe5f 100644 --- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py @@ -158,8 +158,11 @@ class TestPurchaseReceipt(unittest.TestCase): def test_purchase_return_for_rejected_qty(self): from erpnext.stock.doctype.warehouse.test_warehouse import get_warehouse - rejected_warehouse=get_warehouse(company = "_Test Company with perpetual inventory", abbr = " - TCP1", warehouse_name = "_Test Rejected Warehouse").name - print(rejected_warehouse) + rejected_warehouse="_Test Rejected Warehouse - TCP1" + if not frappe.db.exists("Warehouse", rejected_warehouse): + get_warehouse(company = "_Test Company with perpetual inventory", + abbr = " - TCP1", warehouse_name = "_Test Rejected Warehouse").name + pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", received_qty=4, qty=2, rejected_warehouse=rejected_warehouse) return_pr = make_purchase_receipt(company="_Test Company with perpetual inventory", warehouse = "Stores - TCP1", supplier_warehouse = "Work in Progress - TCP1", is_return=1, return_against=pr.name, received_qty = -4, qty=-2, rejected_warehouse=rejected_warehouse) @@ -269,7 +272,7 @@ class TestPurchaseReceipt(unittest.TestCase): if not frappe.db.exists("Item", item_code): item = make_item(item_code, dict(has_serial_no=1)) - serial_no = random_string(5) + serial_no = "12903812901" pr_doc = make_purchase_receipt(item_code=item_code, qty=1, serial_no = serial_no) @@ -282,7 +285,7 @@ class TestPurchaseReceipt(unittest.TestCase): new_pr_doc = make_purchase_receipt(item_code=item_code, qty=1) - serial_no = get_serial_nos(new_pr_doc[0].serial_no)[0] + serial_no = get_serial_nos(new_pr_doc.items[0].serial_no)[0] self.assertEqual(serial_no, frappe.db.get_value("Serial No", {"purchase_document_type": "Purchase Receipt", "purchase_document_no": new_pr_doc.name}, "name")) diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 855ab7a9662..f34b0472f0d 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -379,6 +379,7 @@ def auto_make_serial_nos(args): if sr.sales_order and args.get('voucher_type') == "Stock Entry" \ and not args.get('actual_qty', 0) > 0: sr.sales_order = None + sr.update_serial_no_reference() sr.save(ignore_permissions=True) elif args.get('actual_qty', 0) > 0: created_numbers.append(make_serial_no(serial_no, args)) From c7e523cee437f7af7821ea893d8f1fc46ea323d7 Mon Sep 17 00:00:00 2001 From: thefalconx33 Date: Sun, 9 Feb 2020 12:19:03 +0530 Subject: [PATCH 34/43] fix: mandatory warehouse wrror while updating items after submission --- erpnext/controllers/accounts_controller.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index 7faf792d203..001da5b5ea8 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -1135,6 +1135,7 @@ def set_sales_order_defaults(parent_doctype, parent_doctype_name, child_docname, child_item.reqd_by_date = p_doctype.delivery_date child_item.uom = item.stock_uom child_item.conversion_factor = get_conversion_factor(item_code, item.stock_uom).get("conversion_factor") or 1.0 + child_item.warehouse = p_doctype.set_warehouse or p_doctype.items[0].warehouse return child_item From ec45c096a08983e10e2f57bddab1eb14f192b773 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Sun, 9 Feb 2020 19:45:42 +0530 Subject: [PATCH 35/43] fix: pricing rule not working on item groups (#20546) --- .../doctype/pricing_rule/test_pricing_rule.py | 48 +++++++++++++++++++ .../accounts/doctype/pricing_rule/utils.py | 2 +- .../setup/doctype/item_group/item_group.py | 12 ++--- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index 332a9007915..9c1fef69fac 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py @@ -9,6 +9,8 @@ from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_orde from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.stock.get_item_details import get_item_details from frappe import MandatoryError +from erpnext.stock.doctype.item.test_item import make_item +from erpnext.healthcare.doctype.lab_test_template.lab_test_template import make_item_price class TestPricingRule(unittest.TestCase): def setUp(self): @@ -145,6 +147,52 @@ class TestPricingRule(unittest.TestCase): self.assertEquals(details.get("margin_type"), "Percentage") self.assertEquals(details.get("margin_rate_or_amount"), 10) + def test_mixed_conditions_for_item_group(self): + for item in ["Mixed Cond Item 1", "Mixed Cond Item 2"]: + make_item(item, {"item_group": "Products"}) + make_item_price(item, "_Test Price List", 100) + + test_record = { + "doctype": "Pricing Rule", + "title": "_Test Pricing Rule for Item Group", + "apply_on": "Item Group", + "item_groups": [ + { + "item_group": "Products", + }, + { + "item_group": "Seed", + }, + ], + "selling": 1, + "mixed_conditions": 1, + "currency": "USD", + "rate_or_discount": "Discount Percentage", + "discount_percentage": 10, + "applicable_for": "Customer Group", + "customer_group": "All Customer Groups", + "company": "_Test Company" + } + frappe.get_doc(test_record.copy()).insert() + + args = frappe._dict({ + "item_code": "Mixed Cond Item 1", + "item_group": "Products", + "company": "_Test Company", + "price_list": "_Test Price List", + "currency": "_Test Currency", + "doctype": "Sales Order", + "conversion_rate": 1, + "price_list_currency": "_Test Currency", + "plc_conversion_rate": 1, + "order_type": "Sales", + "customer": "_Test Customer", + "customer_group": "_Test Customer Group", + "name": None + }) + details = get_item_details(args) + self.assertEquals(details.get("discount_percentage"), 10) + def test_pricing_rule_for_variants(self): from erpnext.stock.get_item_details import get_item_details from frappe import MandatoryError diff --git a/erpnext/accounts/doctype/pricing_rule/utils.py b/erpnext/accounts/doctype/pricing_rule/utils.py index fe68fdb6c0f..e475563c77c 100644 --- a/erpnext/accounts/doctype/pricing_rule/utils.py +++ b/erpnext/accounts/doctype/pricing_rule/utils.py @@ -489,7 +489,7 @@ def get_pricing_rule_items(pr_doc): for d in pr_doc.get(pricing_rule_apply_on): if apply_on == 'item_group': - get_child_item_groups(d.get(apply_on)) + apply_on_data.extend(get_child_item_groups(d.get(apply_on))) else: apply_on_data.append(d.get(apply_on)) diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py index 9f258828660..43778404b60 100644 --- a/erpnext/setup/doctype/item_group/item_group.py +++ b/erpnext/setup/doctype/item_group/item_group.py @@ -174,15 +174,11 @@ def get_child_groups(item_group_name): and show_in_website = 1""", {"lft": item_group.lft, "rgt": item_group.rgt}) def get_child_item_groups(item_group_name): - child_item_groups = frappe.cache().hget("child_item_groups", item_group_name) + item_group = frappe.get_cached_value("Item Group", + item_group_name, ["lft", "rgt"], as_dict=1) - if not child_item_groups: - item_group = frappe.get_cached_doc("Item Group", item_group_name) - - child_item_groups = [d.name for d in frappe.get_all('Item Group', - filters= {'lft': ('>=', item_group.lft),'rgt': ('>=', item_group.rgt)})] - - frappe.cache().hset("child_item_groups", item_group_name, child_item_groups) + child_item_groups = [d.name for d in frappe.get_all('Item Group', + filters= {'lft': ('>=', item_group.lft),'rgt': ('<=', item_group.rgt)})] return child_item_groups or {} From 1343a4b7557266b2d8ec4d2b3b3c0498deb38ff5 Mon Sep 17 00:00:00 2001 From: Rucha Mahabal Date: Mon, 10 Feb 2020 00:31:44 +0530 Subject: [PATCH 36/43] fix: patch for creating irs_1099 custom field (United States) --- erpnext/patches.txt | 1 + .../v12_0/create_irs_1099_field_united_states.py | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 erpnext/patches/v12_0/create_irs_1099_field_united_states.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 17c9a20766d..9fde54225ac 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -648,3 +648,4 @@ erpnext.patches.v12_0.update_owner_fields_in_acc_dimension_custom_fields erpnext.patches.v12_0.remove_denied_leaves_from_leave_ledger erpnext.patches.v12_0.update_price_or_product_discount erpnext.patches.v12_0.add_export_type_field_in_party_master +erpnext.patches.v12_0.create_irs_1099_field_united_states \ No newline at end of file diff --git a/erpnext/patches/v12_0/create_irs_1099_field_united_states.py b/erpnext/patches/v12_0/create_irs_1099_field_united_states.py new file mode 100644 index 00000000000..3e4c87f434e --- /dev/null +++ b/erpnext/patches/v12_0/create_irs_1099_field_united_states.py @@ -0,0 +1,10 @@ +from __future__ import unicode_literals +import frappe +from erpnext.regional.united_states.setup import make_custom_fields + +def execute(): + company = frappe.get_all('Company', filters = {'country': 'United States'}) + if not company: + return + + make_custom_fields() \ No newline at end of file From 495ab6c7f241c7e6984ab516dc4ff4b31c5cb760 Mon Sep 17 00:00:00 2001 From: Ashish Shah Date: Mon, 10 Feb 2020 11:13:27 +0530 Subject: [PATCH 37/43] fix: backflush raw material based on - Material Transferred for Manufacture MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi @nabinhait , Issue : Manufacturing setting > Backflush Raw Material Based on “Material Transferred for Manufacture” doesn't fetch the actual raw material transferred qty. It fetches qty based on "BOM" The issue is because @creamdory in PR #https://github.com/frappe/erpnext/pull/13384 commit : https://github.com/frappe/erpnext/pull/13384/files#diff-91f0ed661ef4b6e1f167fc7961b1a79b ``` changed from: if trans_qty and manufacturing_qty >= (produced_qty + flt(self.fg_completed_qty)): to : if trans_qty and manufacturing_qty > (produced_qty + flt(self.fg_completed_qty)): ``` **'='** was added by her in the condition, which was not there before her commit. Kindly except the fix for the issue. https://github.com/frappe/erpnext/blob/develop/erpnext/stock/doctype/stock_entry/stock_entry.py#L1057 https://github.com/frappe/erpnext/pull/13384 https://github.com/frappe/erpnext/pull/13384/files#diff-91f0ed661ef4b6e1f167fc7961b1a79b **before fix gif** : Stock Entry = Manufacture shows raw material quantity as per BOM. ![FetchTransQtyError](https://user-images.githubusercontent.com/29812965/74123824-ffdd8600-4bf5-11ea-8873-95de24a7ef09.gif) **after fix gi**f : Stock Entry = "Manufacture" shows raw material quantity as per "Material Transfer for Manufacture". ![FetchTransQtyFix](https://user-images.githubusercontent.com/29812965/74123836-0c61de80-4bf6-11ea-86fb-d9619fd9b02b.gif) --- erpnext/stock/doctype/stock_entry/stock_entry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py index 4b07f0aef9f..56cb3f06b94 100644 --- a/erpnext/stock/doctype/stock_entry/stock_entry.py +++ b/erpnext/stock/doctype/stock_entry/stock_entry.py @@ -1056,7 +1056,7 @@ class StockEntry(StockController): req_qty_each = flt(req_qty / manufacturing_qty) consumed_qty = flt(req_items[0].consumed_qty) - if trans_qty and manufacturing_qty >= (produced_qty + flt(self.fg_completed_qty)): + if trans_qty and manufacturing_qty > (produced_qty + flt(self.fg_completed_qty)): if qty >= req_qty: qty = (req_qty/trans_qty) * flt(self.fg_completed_qty) else: From a7c27596bb0607b749fcec1a2313405e01ddc674 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Mon, 10 Feb 2020 15:30:22 +0530 Subject: [PATCH 38/43] fix: added indexing on columns to fix performace issue --- .../accounts/doctype/gl_entry/gl_entry.json | 805 ++---------------- .../doctype/sales_invoice/sales_invoice.json | 7 +- 2 files changed, 63 insertions(+), 749 deletions(-) diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.json b/erpnext/accounts/doctype/gl_entry/gl_entry.json index a232a953f31..e64bc9e0c78 100644 --- a/erpnext/accounts/doctype/gl_entry/gl_entry.json +++ b/erpnext/accounts/doctype/gl_entry/gl_entry.json @@ -1,971 +1,286 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, "autoname": "ACC-GLE-.YYYY.-.#####", - "beta": 0, "creation": "2013-01-10 16:34:06", - "custom": 0, - "docstatus": 0, "doctype": "DocType", "document_type": "Document", - "editable_grid": 0, + "engine": "InnoDB", + "field_order": [ + "posting_date", + "transaction_date", + "account", + "party_type", + "party", + "cost_center", + "debit", + "credit", + "account_currency", + "debit_in_account_currency", + "credit_in_account_currency", + "against", + "against_voucher_type", + "against_voucher", + "voucher_type", + "voucher_no", + "voucher_detail_no", + "project", + "remarks", + "is_opening", + "is_advance", + "fiscal_year", + "company", + "finance_book", + "to_rename", + "due_date" + ], "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "posting_date", "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Posting Date", - "length": 0, - "no_copy": 0, "oldfieldname": "posting_date", "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "transaction_date", "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Transaction Date", - "length": 0, - "no_copy": 0, "oldfieldname": "transaction_date", - "oldfieldtype": "Date", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "oldfieldtype": "Date" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "account", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, "in_list_view": 1, "in_standard_filter": 1, "label": "Account", - "length": 0, - "no_copy": 0, "oldfieldname": "account", "oldfieldtype": "Link", "options": "Account", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "party_type", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Party Type", - "length": 0, - "no_copy": 0, "options": "DocType", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "party", "fieldtype": "Dynamic Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, "in_standard_filter": 1, "label": "Party", - "length": 0, - "no_copy": 0, "options": "party_type", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "cost_center", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, "in_list_view": 1, - "in_standard_filter": 0, "label": "Cost Center", - "length": 0, - "no_copy": 0, "oldfieldname": "cost_center", "oldfieldtype": "Link", - "options": "Cost Center", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Cost Center" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "debit", "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Debit Amount", - "length": 0, - "no_copy": 0, "oldfieldname": "debit", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Company:company:default_currency" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "credit", "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Credit Amount", - "length": 0, - "no_copy": 0, "oldfieldname": "credit", "oldfieldtype": "Currency", - "options": "Company:company:default_currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Company:company:default_currency" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "account_currency", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Account Currency", - "length": 0, - "no_copy": 0, - "options": "Currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Currency" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "debit_in_account_currency", "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Debit Amount in Account Currency", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "currency" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "credit_in_account_currency", "fieldtype": "Currency", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Credit Amount in Account Currency", - "length": 0, - "no_copy": 0, - "options": "currency", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "currency" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "against", "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Against", - "length": 0, - "no_copy": 0, "oldfieldname": "against", - "oldfieldtype": "Text", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "oldfieldtype": "Text" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "against_voucher_type", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Against Voucher Type", - "length": 0, - "no_copy": 0, "oldfieldname": "against_voucher_type", "oldfieldtype": "Data", "options": "DocType", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "against_voucher", "fieldtype": "Dynamic Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Against Voucher", - "length": 0, - "no_copy": 0, "oldfieldname": "against_voucher", "oldfieldtype": "Data", "options": "against_voucher_type", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "voucher_type", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Voucher Type", - "length": 0, - "no_copy": 0, "oldfieldname": "voucher_type", "oldfieldtype": "Select", "options": "DocType", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "voucher_no", "fieldtype": "Dynamic Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, "in_standard_filter": 1, "label": "Voucher No", - "length": 0, - "no_copy": 0, "oldfieldname": "voucher_no", "oldfieldtype": "Data", "options": "voucher_type", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "voucher_detail_no", "fieldtype": "Data", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Voucher Detail No", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 1, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "read_only": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "project", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Project", - "length": 0, - "no_copy": 0, - "options": "Project", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Project" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "remarks", "fieldtype": "Text", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Remarks", - "length": 0, "no_copy": 1, "oldfieldname": "remarks", - "oldfieldtype": "Text", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "oldfieldtype": "Text" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "is_opening", "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Is Opening", - "length": 0, - "no_copy": 0, "oldfieldname": "is_opening", "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "No\nYes" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "is_advance", "fieldtype": "Select", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Is Advance", - "length": 0, - "no_copy": 0, "oldfieldname": "is_advance", "oldfieldtype": "Select", - "options": "No\nYes", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "No\nYes" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "fiscal_year", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Fiscal Year", - "length": 0, - "no_copy": 0, "oldfieldname": "fiscal_year", "oldfieldtype": "Select", - "options": "Fiscal Year", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Fiscal Year" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "company", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, "in_filter": 1, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Company", - "length": 0, - "no_copy": 0, "oldfieldname": "company", "oldfieldtype": "Link", "options": "Company", - "permlevel": 0, - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "fieldname": "finance_book", "fieldtype": "Link", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "Finance Book", - "length": 0, - "no_copy": 0, - "options": "Finance Book", - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "options": "Finance Book" }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, "default": "1", "fieldname": "to_rename", "fieldtype": "Check", "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, "label": "To Rename", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 1, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "search_index": 1 }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fetch_if_empty": 0, "fieldname": "due_date", "fieldtype": "Date", - "hidden": 0, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 0, - "in_standard_filter": 0, - "label": "Due Date", - "length": 0, - "no_copy": 0, - "permlevel": 0, - "precision": "", - "print_hide": 0, - "print_hide_if_no_value": 0, - "read_only": 0, - "remember_last_selected_value": 0, - "report_hide": 0, - "reqd": 0, - "search_index": 0, - "set_only_once": 0, - "translatable": 0, - "unique": 0 + "label": "Due Date" } ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, "icon": "fa fa-list", "idx": 1, - "image_view": 0, "in_create": 1, - "is_submittable": 0, - "issingle": 0, - "istable": 0, - "max_attachments": 0, - "modified": "2019-05-01 07:05:00.366399", + "modified": "2020-02-10 04:54:57.777905", "modified_by": "Administrator", "module": "Accounts", "name": "GL Entry", "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Accounts User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "role": "Accounts User" }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, "email": 1, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, "print": 1, "read": 1, "report": 1, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "role": "Accounts Manager" }, { - "amend": 0, - "cancel": 0, - "create": 0, - "delete": 0, - "email": 0, "export": 1, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 0, "read": 1, "report": 1, - "role": "Auditor", - "set_user_permissions": 0, - "share": 0, - "submit": 0, - "write": 0 + "role": "Auditor" } ], "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, "search_fields": "voucher_no,account,posting_date,against_voucher", - "show_name_in_global_search": 0, "sort_field": "modified", - "sort_order": "DESC", - "track_changes": 0, - "track_seen": 0, - "track_views": 0 + "sort_order": "DESC" } \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 33ee7a2974e..52a0f4e081d 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -1,5 +1,4 @@ { - "actions": [], "allow_import": 1, "autoname": "naming_series:", "creation": "2013-05-24 19:29:05", @@ -373,7 +372,8 @@ "no_copy": 1, "options": "Sales Invoice", "print_hide": 1, - "read_only": 1 + "read_only": 1, + "search_index": 1 }, { "fieldname": "column_break_21", @@ -1568,8 +1568,7 @@ "icon": "fa fa-file-text", "idx": 181, "is_submittable": 1, - "links": [], - "modified": "2019-12-30 19:15:59.580414", + "modified": "2020-02-10 04:57:11.221180", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", From 57d33f9ce6a9e7cc9148d63bd6299d3f2705de82 Mon Sep 17 00:00:00 2001 From: Govind S Menokee Date: Tue, 11 Feb 2020 11:23:16 +0530 Subject: [PATCH 39/43] fix: get_students not respecting the program The get_students function is not taking into account the program for which the fee needs to be created. If a student is enrolled for multiple programs then the fee schedule pull up the wrong count of students. --- erpnext/education/doctype/fee_schedule/fee_schedule.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/erpnext/education/doctype/fee_schedule/fee_schedule.py b/erpnext/education/doctype/fee_schedule/fee_schedule.py index a42800a80d5..bba101f2f1f 100644 --- a/erpnext/education/doctype/fee_schedule/fee_schedule.py +++ b/erpnext/education/doctype/fee_schedule/fee_schedule.py @@ -123,9 +123,11 @@ def get_students(student_group, academic_year, academic_term=None, student_categ students = frappe.db.sql(""" select pe.student, pe.student_name, pe.program, pe.student_batch_name - from `tabStudent Group Student` sgs, `tabProgram Enrollment` pe + from `tabStudent Group Student` sgs, `tabProgram Enrollment` pe, `tabStudent Group` sg where pe.student = sgs.student and pe.academic_year = %s + and sg.program = pe.program + and sg.name = sgs.parent and sgs.parent = %s and sgs.active = 1 {conditions} """.format(conditions=conditions), (academic_year, student_group), as_dict=1) From cde48a44cf5951228d20385461a22a1c296b82fb Mon Sep 17 00:00:00 2001 From: vishal Date: Tue, 11 Feb 2020 11:44:24 +0530 Subject: [PATCH 40/43] fix: filter serial no based on batch no --- erpnext/public/js/utils/serial_no_batch_selector.js | 5 +++-- erpnext/stock/doctype/serial_no/serial_no.py | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/erpnext/public/js/utils/serial_no_batch_selector.js b/erpnext/public/js/utils/serial_no_batch_selector.js index 4ec12ce8e7f..23895ee4c02 100644 --- a/erpnext/public/js/utils/serial_no_batch_selector.js +++ b/erpnext/public/js/utils/serial_no_batch_selector.js @@ -90,7 +90,8 @@ erpnext.SerialNoBatchSelector = Class.extend({ args: { qty: qty, item_code: me.item_code, - warehouse: me.warehouse_details.name + warehouse: me.warehouse_details.name, + batch_no: me.item.batch_no || null } }); @@ -392,7 +393,7 @@ erpnext.SerialNoBatchSelector = Class.extend({ delivery_document_no: "" } - if (this.has_batch) { + if (this.item.batch_no) { serial_no_filters["batch_no"] = this.item.batch_no; } diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 19eb398130c..c8e9b011be9 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -397,7 +397,6 @@ def make_serial_no(serial_no, args): sr.via_stock_ledger = args.get('via_stock_ledger') or True sr.asset = args.get('asset') sr.location = args.get('location') - if args.get('purchase_document_type'): sr.purchase_document_type = args.get('purchase_document_type') @@ -474,10 +473,11 @@ def get_delivery_note_serial_no(item_code, qty, delivery_note): return serial_nos @frappe.whitelist() -def auto_fetch_serial_number(qty, item_code, warehouse): +def auto_fetch_serial_number(qty, item_code, warehouse, batch_no=None): serial_numbers = frappe.get_list("Serial No", filters={ "item_code": item_code, "warehouse": warehouse, + "batch_no": batch_no, "delivery_document_no": "", "sales_invoice": "" }, limit=qty, order_by="creation") From fc4cc9ab42ae36c5e705517e4f327b528dd471c5 Mon Sep 17 00:00:00 2001 From: Er-Naren719 <49683121+Er-Naren719@users.noreply.github.com> Date: Mon, 10 Feb 2020 13:46:47 +0530 Subject: [PATCH 41/43] feat: column width increased for view attachments field (#314) --- erpnext/projects/doctype/project_user/project_user.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/erpnext/projects/doctype/project_user/project_user.json b/erpnext/projects/doctype/project_user/project_user.json index f0a70dd1df9..2f452cc2d75 100644 --- a/erpnext/projects/doctype/project_user/project_user.json +++ b/erpnext/projects/doctype/project_user/project_user.json @@ -1,4 +1,5 @@ { + "actions": [], "creation": "2016-03-25 02:52:19.283003", "doctype": "DocType", "editable_grid": 1, @@ -46,6 +47,7 @@ "fetch_from": "user.full_name", "fieldname": "full_name", "fieldtype": "Read Only", + "in_list_view": 1, "label": "Full Name" }, { @@ -55,7 +57,7 @@ "label": "Welcome email sent" }, { - "columns": 1, + "columns": 2, "default": "0", "fieldname": "view_attachments", "fieldtype": "Check", @@ -74,7 +76,8 @@ } ], "istable": 1, - "modified": "2019-07-15 19:37:26.942294", + "links": [], + "modified": "2020-02-09 23:26:50.321417", "modified_by": "Administrator", "module": "Projects", "name": "Project User", From 660b4d1e2fbef983e99bf4ad5710412b98ac0f02 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Mon, 17 Feb 2020 15:58:31 +0530 Subject: [PATCH 42/43] feat: show numeric values in item configurator (#20430) --- erpnext/portal/product_configurator/utils.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/erpnext/portal/product_configurator/utils.py b/erpnext/portal/product_configurator/utils.py index 336b9319c1d..ce507a39486 100644 --- a/erpnext/portal/product_configurator/utils.py +++ b/erpnext/portal/product_configurator/utils.py @@ -1,4 +1,5 @@ import frappe +import numpy as np from erpnext.portal.product_configurator.item_variants_cache import ItemVariantsCacheManager def get_field_filter_data(): @@ -172,6 +173,7 @@ def get_attributes_and_values(item_code): item_attribute_values = frappe.db.get_all('Item Attribute Value', ['parent', 'attribute_value', 'idx'], order_by='parent asc, idx asc') + item_attribute_values += get_numeric_values() ordered_attribute_value_map = frappe._dict() for iv in item_attribute_values: ordered_attribute_value_map.setdefault(iv.parent, []).append(iv.attribute_value) @@ -184,6 +186,23 @@ def get_attributes_and_values(item_code): return attributes +def get_numeric_values(): + attribute_values_list = [] + numeric_attributes = frappe.get_list("Item Attribute", fields=['name', 'from_range', 'to_range', 'increment'], filters={"numeric_values": 1}) + for attribute in numeric_attributes: + from_range = attribute["from_range"] + to_range = attribute['to_range'] + attribute['increment'] + increment = attribute['increment'] + values = list(np.arange(from_range, to_range, increment)) + + for idx, val in enumerate(values): + attribute_values_list.append(frappe._dict({ + "parent": attribute.get("name"), + "attribute_value": str(int(val)) if val.is_integer() else str(val), + "idx": idx + })) + return attribute_values_list + @frappe.whitelist(allow_guest=True) def get_next_attribute_and_values(item_code, selected_attributes): From f95ac99baa6c60a270b3a4ff52fab3b957b6c12e Mon Sep 17 00:00:00 2001 From: Gavin D'souza Date: Wed, 27 Nov 2019 14:53:58 +0530 Subject: [PATCH 43/43] fix(travis): add lib cups for updated frappe requirements --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 40afeee8d46..365eb67f3dc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -63,6 +63,7 @@ install: - tar -xf /tmp/wkhtmltox.tar.xz -C /tmp - sudo mv /tmp/wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf - sudo chmod o+x /usr/local/bin/wkhtmltopdf + - sudo apt-get install libcups2-dev - cd ~/frappe-bench