From f817663f11b1cb1a0da0f00845f4c0b5355966e4 Mon Sep 17 00:00:00 2001 From: Aulia Bismar Date: Mon, 1 Apr 2019 10:37:28 +0700 Subject: [PATCH 01/41] Renumber Aktiva, remove excess 0 --- .../verified/id_chart_of_accounts.json | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json b/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json index 37f57ec1ad9..d1a0defba94 100644 --- a/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json +++ b/erpnext/accounts/doctype/account/chart_of_accounts/verified/id_chart_of_accounts.json @@ -38,24 +38,24 @@ "Kas": { "Kas Mata Uang Lain": { "Kas USD": { - "account_number": "1112.0010", + "account_number": "1112.001", "account_type": "Cash" }, "account_number": "1112.000" }, "Kas Rupiah": { "Kas Besar": { - "account_number": "1111.0020", + "account_number": "1111.002", "account_type": "Cash" }, "Kas Kecil": { - "account_number": "1111.0010", + "account_number": "1111.001", "account_type": "Cash" }, "account_number": "1111.000", "account_type": "Cash" }, - "account_number": "1110.0000" + "account_number": "1110.000" }, "Pendapatan Yang Akan di Terima": { "Pendapatan Yang di Terima": { @@ -98,7 +98,7 @@ }, "account_number": "1130.000" }, - "account_number": "1100.0000" + "account_number": "1100.000" }, "Aktiva Tetap": { "Aktiva": { @@ -121,20 +121,20 @@ "Investasi": { "Investasi": { "Deposito": { - "account_number": "1231.003", + "account_number": "1231.300", "is_group": 1 }, - "Investai Saham": { + "Investasi Saham": { "Investasi Saham": { - "account_number": "1231.0011" + "account_number": "1231.101" }, - "account_number": "1231.001" + "account_number": "1231.100" }, "Investasi Perumahan": { "Investasi Perumahan": { - "account_number": "1231.0021" + "account_number": "1231.201" }, - "account_number": "1231.002" + "account_number": "1231.200" }, "account_number": "1231.000" }, @@ -142,7 +142,7 @@ }, "account_number": "1200.000" }, - "account_number": "1000.0000", + "account_number": "1000.000", "root_type": "Asset" }, "Beban": { @@ -684,4 +684,4 @@ "root_type": "Income" } } -} \ No newline at end of file +} From 5ba438af809d8a843b856fc2a6a077b736a4d688 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 3 Apr 2019 16:53:19 +0530 Subject: [PATCH 02/41] fix: fetch payment terms --- erpnext/buying/doctype/purchase_order/purchase_order.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 720160676f2..a669238689b 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -416,6 +416,10 @@ def make_purchase_invoice(source_name, target_doc=None): "Purchase Taxes and Charges": { "doctype": "Purchase Taxes and Charges", "add_if_empty": True + }, + "Payment Schedule": { + "doctype": "Payment Schedule", + "add_if_empty": True } }, target_doc, postprocess) From 44d8224a3b29955c7e4a8a5d71769fe708220a27 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Thu, 4 Apr 2019 15:40:36 +0530 Subject: [PATCH 03/41] fix: test case fix --- .../buying/doctype/purchase_order/test_purchase_order.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index f1507364dfb..2962f0ce3ad 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -6,7 +6,7 @@ import unittest import frappe import frappe.defaults from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry -from frappe.utils import flt, add_days, nowdate +from frappe.utils import flt, add_days, nowdate, getdate from erpnext.stock.doctype.item.test_item import make_item from erpnext.buying.doctype.purchase_order.purchase_order import (make_purchase_receipt, make_purchase_invoice, make_rm_stock_entry as make_subcontract_transfer_entry) from erpnext.stock.doctype.material_request.test_material_request import make_material_request @@ -133,7 +133,7 @@ class TestPurchaseOrder(unittest.TestCase): po.submit() self.assertEqual(po.payment_schedule[0].payment_amount, 2500.0) - self.assertEqual(po.payment_schedule[0].due_date, po.transaction_date) + self.assertEqual(po.payment_schedule[0].due_date, getdate(po.transaction_date)) self.assertEqual(po.payment_schedule[1].payment_amount, 2500.0) self.assertEqual(po.payment_schedule[1].due_date, add_days(po.transaction_date, 30)) pi = make_purchase_invoice(po.name) @@ -143,7 +143,7 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEqual(len(pi.get("items", [])), 1) self.assertEqual(pi.payment_schedule[0].payment_amount, 2500.0) - self.assertEqual(pi.payment_schedule[0].due_date, po.transaction_date) + self.assertEqual(pi.payment_schedule[0].due_date, getdate(po.transaction_date)) self.assertEqual(pi.payment_schedule[1].payment_amount, 2500.0) self.assertEqual(pi.payment_schedule[1].due_date, add_days(po.transaction_date, 30)) From 9f2847e86c9ff8d8e2d2c3ace114545624cb9d75 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Fri, 5 Apr 2019 11:40:37 +0530 Subject: [PATCH 04/41] fix: test case fixes for travis --- .../doctype/purchase_order/test_purchase_order.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 2962f0ce3ad..8a472700f58 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -133,9 +133,9 @@ class TestPurchaseOrder(unittest.TestCase): po.submit() self.assertEqual(po.payment_schedule[0].payment_amount, 2500.0) - self.assertEqual(po.payment_schedule[0].due_date, getdate(po.transaction_date)) + self.assertEqual(getdate(po.payment_schedule[0].due_date), getdate(po.transaction_date)) self.assertEqual(po.payment_schedule[1].payment_amount, 2500.0) - self.assertEqual(po.payment_schedule[1].due_date, add_days(po.transaction_date, 30)) + self.assertEqual(getdate(po.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30)) pi = make_purchase_invoice(po.name) pi.save() @@ -143,9 +143,9 @@ class TestPurchaseOrder(unittest.TestCase): self.assertEqual(len(pi.get("items", [])), 1) self.assertEqual(pi.payment_schedule[0].payment_amount, 2500.0) - self.assertEqual(pi.payment_schedule[0].due_date, getdate(po.transaction_date)) + self.assertEqual(getdate(pi.payment_schedule[0].due_date), getdate(po.transaction_date)) self.assertEqual(pi.payment_schedule[1].payment_amount, 2500.0) - self.assertEqual(pi.payment_schedule[1].due_date, add_days(po.transaction_date, 30)) + self.assertEqual(getdate(pi.payment_schedule[1].due_date), add_days(getdate(po.transaction_date), 30)) def test_subcontracting(self): po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes") @@ -276,7 +276,7 @@ class TestPurchaseOrder(unittest.TestCase): pi = make_purchase_invoice(po.name) - self.assertFalse(pi.get('payment_schedule')) + self.assertTrue(pi.get('payment_schedule')) def test_terms_copied(self): po = create_purchase_order(do_not_save=1) From 7df8c0ef82d72920aba342623dc10c5c14b1d8f8 Mon Sep 17 00:00:00 2001 From: Saurabh Date: Tue, 16 Apr 2019 15:57:21 +0530 Subject: [PATCH 05/41] fix: woocommerce settings patch --- .../patches/v11_1/woocommerce_set_creation_user.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/erpnext/patches/v11_1/woocommerce_set_creation_user.py b/erpnext/patches/v11_1/woocommerce_set_creation_user.py index e50d5ae711b..5ccdec6d262 100644 --- a/erpnext/patches/v11_1/woocommerce_set_creation_user.py +++ b/erpnext/patches/v11_1/woocommerce_set_creation_user.py @@ -1,10 +1,11 @@ from __future__ import unicode_literals import frappe +from frappe.utils import cint def execute(): - woocommerce_setting_enable_sync = frappe.db.sql("SELECT t.value FROM tabSingles t WHERE doctype = 'Woocommerce Settings' AND field = 'enable_sync'", as_dict=True) - if len(woocommerce_setting_enable_sync) and woocommerce_setting_enable_sync[0].value == '1': - frappe.db.sql("""UPDATE tabSingles - SET value = (SELECT t.value FROM tabSingles t WHERE doctype = 'Woocommerce Settings' AND field = 'modified_by') - WHERE doctype = 'Woocommerce Settings' - AND field = 'creation_user';""") \ No newline at end of file + frappe.reload_doc("erpnext_integrations", "doctype","woocommerce_settings") + doc = frappe.get_doc("Woocommerce Settings") + + if cint(doc.enable_sync): + doc.creation_user = doc.modified_by + doc.save(ignore_permissions=True) \ No newline at end of file From 64980fed5971d7af28c0714b6ec6529d91279039 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Tue, 16 Apr 2019 16:29:13 +0530 Subject: [PATCH 06/41] fix: validate percentage total --- erpnext/selling/doctype/customer/customer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/erpnext/selling/doctype/customer/customer.js b/erpnext/selling/doctype/customer/customer.js index 3b0e75ff6ca..89811656eed 100644 --- a/erpnext/selling/doctype/customer/customer.js +++ b/erpnext/selling/doctype/customer/customer.js @@ -123,5 +123,11 @@ frappe.ui.form.on("Customer", { }, validate: function(frm) { if(frm.doc.lead_name) frappe.model.clear_doc("Lead", frm.doc.lead_name); + + var total = 0; + for (var idx in frm.doc.sales_team) { + total += frm.doc.sales_team[idx].allocated_percentage; + if (total > 100) frappe.throw(__("Total contribution percentage can't exceed 100")); + } }, }); \ No newline at end of file From b380a02d09412ff617bc9f9d6f9ee932eca07d9e Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Tue, 16 Apr 2019 16:52:55 +0530 Subject: [PATCH 07/41] fix: make salary details submitable if salary structure is submitted --- erpnext/patches.txt | 3 ++- .../patches/v11_1/set_salary_details_submitable.py | 12 ++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 erpnext/patches/v11_1/set_salary_details_submitable.py diff --git a/erpnext/patches.txt b/erpnext/patches.txt index e64aa378e2e..2df10899800 100755 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -590,4 +590,5 @@ erpnext.patches.v10_0.item_barcode_childtable_migrate # 16-02-2019 erpnext.patches.v11_0.make_italian_localization_fields # 26-03-2019 erpnext.patches.v11_1.make_job_card_time_logs erpnext.patches.v11_1.set_variant_based_on -erpnext.patches.v11_1.woocommerce_set_creation_user \ No newline at end of file +erpnext.patches.v11_1.woocommerce_set_creation_user +erpnext.patches.v11_1.set_salary_details_submitable \ No newline at end of file diff --git a/erpnext/patches/v11_1/set_salary_details_submitable.py b/erpnext/patches/v11_1/set_salary_details_submitable.py new file mode 100644 index 00000000000..36e78792ecb --- /dev/null +++ b/erpnext/patches/v11_1/set_salary_details_submitable.py @@ -0,0 +1,12 @@ +from __future__ import unicode_literals +import frappe +import itertools + +def execute(): + salary_structure = frappe.get_all("Salary Structure", filters={"docstatus": 1}, as_list=1) + salary_structure = list(itertools.chain(*salary_structure)) + salary_structure = "', '".join(map(str, salary_structure)) + + query = ''' update `tabSalary Detail` set docstatus=1 where parent in ('{0}')'''.format(salary_structure) + frappe.db.sql(query) + From d6757b7af6bcfd64406d8d11ba5e0eb2ec9ad088 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Tue, 16 Apr 2019 17:32:45 +0530 Subject: [PATCH 08/41] fix: total error arissing due to blank link field --- erpnext/projects/report/billing_summary.py | 16 ---------------- .../employee_billing_summary.json | 4 ++-- .../project_billing_summary.json | 4 ++-- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/erpnext/projects/report/billing_summary.py b/erpnext/projects/report/billing_summary.py index 4906ba9d997..d2a229315fd 100644 --- a/erpnext/projects/report/billing_summary.py +++ b/erpnext/projects/report/billing_summary.py @@ -54,9 +54,6 @@ def get_data(filters): data = [] record = get_records(filters) - billable_hours_worked = 0 - hours_worked = 0 - working_cost = 0 for entries in record: total_hours = 0 total_billable_hours = 0 @@ -81,11 +78,6 @@ def get_data(filters): total_hours, total_billable_hours, total_amount = get_billable_and_total_hours(activity, time_end, time_start, total_hours, total_billable_hours, total_amount) - - hours_worked += total_hours - billable_hours_worked += total_billable_hours - working_cost += total_amount - row = { "employee": entries.employee, "employee_name": entries.employee_name, @@ -97,14 +89,6 @@ def get_data(filters): if entries_exists: data.append(row) entries_exists = False - - total = { - "total_billable_hours": billable_hours_worked, - "total_hours": hours_worked, - "amount": working_cost - } - if billable_hours_worked !=0 or hours_worked !=0 or working_cost !=0: - data.append(total) return data def get_records(filters): diff --git a/erpnext/projects/report/employee_billing_summary/employee_billing_summary.json b/erpnext/projects/report/employee_billing_summary/employee_billing_summary.json index 433ebac5ddf..cab8db251c8 100644 --- a/erpnext/projects/report/employee_billing_summary/employee_billing_summary.json +++ b/erpnext/projects/report/employee_billing_summary/employee_billing_summary.json @@ -1,5 +1,5 @@ { - "add_total_row": 0, + "add_total_row": 1, "creation": "2019-03-08 15:08:19.929728", "disable_prepared_report": 0, "disabled": 0, @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2019-03-08 15:08:19.929728", + "modified": "2019-04-16 17:29:18.376932", "modified_by": "Administrator", "module": "Projects", "name": "Employee Billing Summary", diff --git a/erpnext/projects/report/project_billing_summary/project_billing_summary.json b/erpnext/projects/report/project_billing_summary/project_billing_summary.json index a3f91c802d5..c65053e85be 100644 --- a/erpnext/projects/report/project_billing_summary/project_billing_summary.json +++ b/erpnext/projects/report/project_billing_summary/project_billing_summary.json @@ -1,5 +1,5 @@ { - "add_total_row": 0, + "add_total_row": 1, "creation": "2019-03-11 16:22:39.460524", "disable_prepared_report": 0, "disabled": 0, @@ -7,7 +7,7 @@ "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2019-03-11 16:22:39.460524", + "modified": "2019-04-16 17:28:32.749633", "modified_by": "Administrator", "module": "Projects", "name": "Project Billing Summary", From 82e76b2c0c7c223ca01287e34e269acc0342c435 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira <33246109+kennethsequeira@users.noreply.github.com> Date: Tue, 16 Apr 2019 18:00:21 +0530 Subject: [PATCH 09/41] Improve Validation Message in BOM Update following validation message: "Price not found for item {0} and price list {1}" to "Price not found for item {0} in price list {1}" --- erpnext/manufacturing/doctype/bom/bom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py index c65693bddf6..b04ba7c4fb0 100644 --- a/erpnext/manufacturing/doctype/bom/bom.py +++ b/erpnext/manufacturing/doctype/bom/bom.py @@ -201,7 +201,7 @@ class BOM(WebsiteGenerator): if not rate: if self.rm_cost_as_per == "Price List": - frappe.msgprint(_("Price not found for item {0} and price list {1}") + frappe.msgprint(_("Price not found for item {0} in price list {1}") .format(arg["item_code"], self.buying_price_list), alert=True) else: frappe.msgprint(_("{0} not found for item {1}") From 15c7a058799cd7e18dd85dd4061af6d39e16ecb6 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Tue, 16 Apr 2019 19:16:14 +0530 Subject: [PATCH 10/41] fix: If finance book filter is not set then show all the entries --- .../accounts_receivable.py | 7 +------ .../asset_depreciation_ledger.py | 5 +---- .../consolidated_financial_statement.py | 19 +++++++------------ .../customer_ledger_summary.py | 8 ++------ .../accounts/report/financial_statements.py | 10 ++-------- .../report/general_ledger/general_ledger.py | 6 +----- 6 files changed, 14 insertions(+), 41 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py index d49a33bd016..b7154550297 100755 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.py +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.py @@ -487,13 +487,8 @@ class ReceivablePayableReport(object): conditions.append("company=%s") values.append(self.filters.company) - company_finance_book = erpnext.get_default_finance_book(self.filters.company) - - if not self.filters.finance_book or (self.filters.finance_book == company_finance_book): + if self.filters.finance_book: conditions.append("ifnull(finance_book,'') in (%s, '')") - values.append(company_finance_book) - elif self.filters.finance_book: - conditions.append("ifnull(finance_book,'') = %s") values.append(self.filters.finance_book) if self.filters.get(party_type_field): diff --git a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py index 36131319101..16bef565252 100644 --- a/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py +++ b/erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py @@ -31,11 +31,8 @@ def get_data(filters): filters_data.append(["against_voucher", "in", assets]) - company_finance_book = erpnext.get_default_finance_book(filters.get("company")) - if (not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book)): + if filters.get("finance_book"): filters_data.append(["finance_book", "in", ['', filters.get('finance_book')]]) - elif filters.get("finance_book"): - filters_data.append(["finance_book", "=", filters.get('finance_book')]) gl_entries = frappe.get_all('GL Entry', filters= filters_data, 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 b9aebd83f93..1bb8580f644 100644 --- a/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py +++ b/erpnext/accounts/report/consolidated_financial_statement/consolidated_financial_statement.py @@ -101,7 +101,7 @@ def get_income_expense_data(companies, fiscal_year, filters): net_profit_loss = get_net_profit_loss(income, expense, companies, filters.company, company_currency, True) return income, expense, net_profit_loss - + def get_cash_flow_data(fiscal_year, companies, filters): cash_flow_accounts = get_cash_flow_accounts() @@ -123,7 +123,7 @@ def get_cash_flow_data(fiscal_year, companies, filters): # add first net income in operations section if net_profit_loss: net_profit_loss.update({ - "indent": 1, + "indent": 1, "parent_account": cash_flow_accounts[0]['section_header'] }) data.append(net_profit_loss) @@ -327,7 +327,7 @@ def set_gl_entries_by_account(from_date, to_date, root_lft, root_rgt, filters, g accounts_by_name, ignore_closing_entries=False): """Returns a dict like { "account": [gl entries], ... }""" - company_lft, company_rgt = frappe.get_cached_value('Company', + company_lft, company_rgt = frappe.get_cached_value('Company', filters.get('company'), ["lft", "rgt"]) additional_conditions = get_additional_conditions(from_date, ignore_closing_entries, filters) @@ -354,7 +354,8 @@ def set_gl_entries_by_account(from_date, to_date, root_lft, root_rgt, filters, g "to_date": to_date, "lft": root_lft, "rgt": root_rgt, - "company": d.name + "company": d.name, + "finance_book": filters.get("finance_book") }, as_dict=True) @@ -384,14 +385,8 @@ def get_additional_conditions(from_date, ignore_closing_entries, filters): if from_date: additional_conditions.append("gl.posting_date >= %(from_date)s") - company_finance_book = erpnext.get_default_finance_book(filters.get("company")) - - if not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book): - additional_conditions.append("ifnull(finance_book, '') in ('%s', '')" % - frappe.db.escape(company_finance_book)) - elif filters.get("finance_book"): - additional_conditions.append("ifnull(finance_book, '') = '%s' " % - frappe.db.escape(filters.get("finance_book"))) + if filters.get("finance_book"): + additional_conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')") return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else "" diff --git a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py index 23b963b759e..7872dbe7b16 100644 --- a/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py +++ b/erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.py @@ -184,12 +184,8 @@ class PartyLedgerSummaryReport(object): if self.filters.company: conditions.append("gle.company=%(company)s") - self.filters.company_finance_book = erpnext.get_default_finance_book(self.filters.company) - - if not self.filters.finance_book or (self.filters.finance_book == self.filters.company_finance_book): - conditions.append("ifnull(finance_book,'') in (%(company_finance_book)s, '')") - elif self.filters.finance_book: - conditions.append("ifnull(finance_book,'') = %(finance_book)s") + if self.filters.finance_book: + conditions.append("ifnull(finance_book,'') in (%(finance_book)s, '')") if self.filters.get("party"): conditions.append("party=%(party)s") diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index e9aecfb394e..52056ef2193 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -392,14 +392,8 @@ 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") - company_finance_book = erpnext.get_default_finance_book(filters.get("company")) - - if not filters.get('finance_book') or (filters.get('finance_book') == company_finance_book): - additional_conditions.append("ifnull(finance_book, '') in ('%s', '')" % - frappe.db.escape(company_finance_book)) - elif filters.get("finance_book"): - additional_conditions.append("ifnull(finance_book, '') = '%s' " % - frappe.db.escape(filters.get("finance_book"))) + if filters.get("finance_book"): + additional_conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')") return " and {}".format(" and ".join(additional_conditions)) if additional_conditions else "" diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index ecb18f78b18..44ca8d3549a 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -186,12 +186,8 @@ def get_conditions(filters): if filters.get("project"): conditions.append("project in %(project)s") - company_finance_book = erpnext.get_default_finance_book(filters.get("company")) - if not filters.get("finance_book") or (filters.get("finance_book") == company_finance_book): - filters['finance_book'] = company_finance_book + if filters.get("finance_book"): conditions.append("ifnull(finance_book, '') in (%(finance_book)s, '')") - elif filters.get("finance_book"): - conditions.append("ifnull(finance_book, '') = %(finance_book)s") from frappe.desk.reportview import build_match_conditions match_conditions = build_match_conditions("GL Entry") From 07f8e6bbfc7bf92fbd8eb3e98abe76292a83a723 Mon Sep 17 00:00:00 2001 From: NahuelOperto Date: Tue, 16 Apr 2019 11:35:16 -0300 Subject: [PATCH 11/41] fix get_item_warehouse_quantity_map method --- .../available_stock_for_packing_items.py | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py b/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py index 1e45a736735..48494247595 100644 --- a/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py +++ b/erpnext/selling/report/available_stock_for_packing_items/available_stock_for_packing_items.py @@ -12,7 +12,7 @@ def execute(filters=None): iwq_map = get_item_warehouse_quantity_map() item_map = get_item_details() - data = [] + data = [] for sbom, warehouse in iwq_map.items(): total = 0 total_qty = 0 @@ -21,7 +21,7 @@ def execute(filters=None): total += 1 row = [sbom, item_map.get(sbom).item_name, item_map.get(sbom).description, item_map.get(sbom).stock_uom, wh] - available_qty = min(item_qty.values()) + available_qty = item_qty total_qty += flt(available_qty) row += [available_qty] @@ -66,15 +66,30 @@ def get_item_warehouse_quantity(): return iwq_map def get_item_warehouse_quantity_map(): + query = """SELECT parent, warehouse, MIN(qty) AS qty + FROM (SELECT b.parent, bi.item_code, bi.warehouse, + sum(bi.projected_qty) / b.qty AS qty + FROM tabBin AS bi, (SELECT b.parent, b.item_code, b.qty, w.name + FROM `tabProduct Bundle Item` b, `tabWarehouse` w) AS b + WHERE bi.item_code = b.item_code + AND bi.warehouse = b.name + GROUP BY b.parent, b.item_code, bi.warehouse + UNION ALL + SELECT b.parent, b.item_code, b.name, 0 AS qty + FROM (SELECT b.parent, b.item_code, b.qty, w.name + FROM `tabProduct Bundle Item` b, `tabWarehouse` w) AS b + WHERE NOT EXISTS(SELECT * + FROM `tabBin` AS bi + WHERE bi.item_code = b.item_code + AND bi.warehouse = b.name)) AS r + GROUP BY parent, warehouse + HAVING MIN(qty) != 0""" + result = frappe.db.sql(query, as_dict=1) + last_sbom = "" sbom_map = {} - iwq_map = get_item_warehouse_quantity() - sbom_item_map = get_product_bundle_items() - - for sbom, sbom_items in sbom_item_map.items(): - for item, child_qty in sbom_items.items(): - for wh, qty in iwq_map.get(item, {}).items(): - avail_qty = flt(qty) / flt(child_qty) - sbom_map.setdefault(sbom, {}).setdefault(wh, {}) \ - .setdefault(item, avail_qty) - - return sbom_map \ No newline at end of file + for line in result: + if line.get("parent") != last_sbom: + last_sbom = line.get("parent") + actual_dict = sbom_map.setdefault(last_sbom, {}) + actual_dict.setdefault(line.get("warehouse"), line.get("qty")) + return sbom_map From 4bccd692e5afb1c167ed273e1b5cd46a7937ad5d Mon Sep 17 00:00:00 2001 From: deepeshgarg007 Date: Tue, 16 Apr 2019 20:50:46 +0530 Subject: [PATCH 12/41] fix: GSTR1 B2C report fix --- erpnext/regional/report/gstr_1/gstr_1.py | 49 +++++++++++++++++++----- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/erpnext/regional/report/gstr_1/gstr_1.py b/erpnext/regional/report/gstr_1/gstr_1.py index 0c7d066216a..aba12dc09ee 100644 --- a/erpnext/regional/report/gstr_1/gstr_1.py +++ b/erpnext/regional/report/gstr_1/gstr_1.py @@ -38,7 +38,6 @@ class Gstr1Report(object): shipping_bill_date, reason_for_issuing_document """ - self.customer_type = "Company" if self.filters.get("type_of_business") == "B2B" else "Individual" def run(self): self.get_columns() @@ -54,18 +53,50 @@ class Gstr1Report(object): return self.columns, self.data def get_data(self): + + if self.filters.get("type_of_business") == "B2C Small": + self.get_b2cs_data() + else: + for inv, items_based_on_rate in self.items_based_on_tax_rate.items(): + invoice_details = self.invoices.get(inv) + for rate, items in items_based_on_rate.items(): + row, taxable_value = self.get_row_data_for_invoice(inv, invoice_details, rate, items) + + if self.filters.get("type_of_business") == "CDNR": + row.append("Y" if invoice_details.posting_date <= date(2017, 7, 1) else "N") + row.append("C" if invoice_details.return_against else "R") + + self.data.append(row) + + def get_b2cs_data(self): + b2cs_output = {} + for inv, items_based_on_rate in self.items_based_on_tax_rate.items(): invoice_details = self.invoices.get(inv) + for rate, items in items_based_on_rate.items(): - row, taxable_value = self.get_row_data_for_invoice(inv, invoice_details, rate, items) - if self.filters.get("type_of_business") == "B2C Small": - row.append("E" if invoice_details.ecommerce_gstin else "OE") + place_of_supply = invoice_details.get("place_of_supply") + ecommerce_gstin = invoice_details.get("ecommerce_gstin") - if self.filters.get("type_of_business") == "CDNR": - row.append("Y" if invoice_details.posting_date <= date(2017, 7, 1) else "N") - row.append("C" if invoice_details.return_against else "R") + b2cs_output.setdefault((rate, place_of_supply, ecommerce_gstin),{ + "place_of_supply": "", + "ecommerce_gstin": "", + "rate": "", + "taxable_value": 0, + "cess_amount": 0, + "type": 0 + }) - self.data.append(row) + row = b2cs_output.get((rate, place_of_supply, ecommerce_gstin)) + row["place_of_supply"] = place_of_supply + row["ecommerce_gstin"] = ecommerce_gstin + row["rate"] = rate + row["taxable_value"] += sum([abs(net_amount) + for item_code, net_amount in self.invoice_items.get(inv).items() if item_code in items]) + row["type"] = "E" if ecommerce_gstin else "OE" + + for key, value in iteritems(b2cs_output): + self.data.append(value) def get_row_data_for_invoice(self, invoice, invoice_details, tax_rate, items): row = [] @@ -113,7 +144,7 @@ class Gstr1Report(object): if self.filters.get(opts[0]): conditions += opts[1] - customers = frappe.get_all("Customer", filters={"customer_type": self.customer_type}) + customers = frappe.get_all("Customer", filters={"disabled": 0}) if self.filters.get("type_of_business") == "B2B": conditions += """ and ifnull(invoice_type, '') != 'Export' and is_return != 1 From 97bf12734a9126fba9e1de7552810c2e28faa12e Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 16 Apr 2019 22:11:22 +0530 Subject: [PATCH 13/41] fix: Pull items from PR to PI --- erpnext/controllers/accounts_controller.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index bb088cfe118..ca24cd670bd 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -30,9 +30,8 @@ class AccountsController(TransactionBase): return self.__company_currency def onload(self): - if self.get("__onload"): - self.get("__onload").make_payment_via_journal_entry \ - = frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry') + self.set_onload("make_payment_via_journal_entry", + frappe.db.get_single_value('Accounts Settings', 'make_payment_via_journal_entry')) if self.is_new(): relevant_docs = ("Quotation", "Purchase Order", "Sales Order", From 7be07361547b8ff05b3642d9350db08f7031d148 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Tue, 16 Apr 2019 23:05:39 +0530 Subject: [PATCH 14/41] fix: removed debug --- erpnext/projects/doctype/project/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index f52d8fde35c..ebb15997962 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -241,7 +241,7 @@ class Project(Document): from_expense_claim = frappe.db.sql("""select sum(total_sanctioned_amount) as total_sanctioned_amount from `tabExpense Claim` where project = %s - and docstatus = 1""", self.name, as_dict=1, debug=1)[0] + and docstatus = 1""", self.name, as_dict=1)[0] self.actual_start_date = from_time_sheet.start_date self.actual_end_date = from_time_sheet.end_date From ba47f897026a11d5c4d1c845213d8228c81724a1 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 17 Apr 2019 11:24:04 +0530 Subject: [PATCH 15/41] fix: added a single value to fetch payment terms --- .../doctype/fetch_payment_terms/__init__.py | 0 .../fetch_payment_terms.js | 8 ++ .../fetch_payment_terms.json | 96 +++++++++++++++++++ .../fetch_payment_terms.py | 10 ++ .../test_fetch_payment_terms.js | 23 +++++ .../test_fetch_payment_terms.py | 10 ++ .../doctype/purchase_order/purchase_order.py | 16 ++-- erpnext/config/accounts.py | 8 +- 8 files changed, 164 insertions(+), 7 deletions(-) create mode 100644 erpnext/accounts/doctype/fetch_payment_terms/__init__.py create mode 100644 erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js create mode 100644 erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json create mode 100644 erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py create mode 100644 erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js create mode 100644 erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py diff --git a/erpnext/accounts/doctype/fetch_payment_terms/__init__.py b/erpnext/accounts/doctype/fetch_payment_terms/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js new file mode 100644 index 00000000000..faa011c9fe3 --- /dev/null +++ b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js @@ -0,0 +1,8 @@ +// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Fetch Payment Terms', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json new file mode 100644 index 00000000000..c1f83459f81 --- /dev/null +++ b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json @@ -0,0 +1,96 @@ +{ + "allow_copy": 0, + "allow_events_in_timeline": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2019-04-17 11:00:32.823034", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 0, + "engine": "InnoDB", + "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": "fetch_payment_terms", + "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": "Always Fetch Payment Terms", + "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 + } + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 1, + "istable": 0, + "max_attachments": 0, + "modified": "2019-04-17 11:06:02.216048", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Fetch Payment Terms", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "System Manager", + "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": 0, + "sort_field": "modified", + "sort_order": "ASC", + "track_changes": 1, + "track_seen": 0, + "track_views": 0 +} \ No newline at end of file diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py new file mode 100644 index 00000000000..c7bdd177e7e --- /dev/null +++ b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class FetchPaymentTerms(Document): + pass diff --git a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js new file mode 100644 index 00000000000..80fd8e34f02 --- /dev/null +++ b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js @@ -0,0 +1,23 @@ +/* eslint-disable */ +// rename this file from _test_[name] to test_[name] to activate +// and remove above this line + +QUnit.test("test: Fetch Payment Terms", function (assert) { + let done = assert.async(); + + // number of asserts + assert.expect(1); + + frappe.run_serially([ + // insert a new Fetch Payment Terms + () => frappe.tests.make('Fetch Payment Terms', [ + // values to be set + {key: 'value'} + ]), + () => { + assert.equal(cur_frm.doc.key, 'value'); + }, + () => done() + ]); + +}); diff --git a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py new file mode 100644 index 00000000000..771a44c208e --- /dev/null +++ b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +class TestFetchPaymentTerms(unittest.TestCase): + pass diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index a669238689b..27bce5b828a 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -393,7 +393,7 @@ def make_purchase_invoice(source_name, target_doc=None): or item.get("buying_cost_center") or item_group.get("buying_cost_center")) - doc = get_mapped_doc("Purchase Order", source_name, { + fields = { "Purchase Order": { "doctype": "Purchase Invoice", "field_map": { @@ -416,12 +416,16 @@ def make_purchase_invoice(source_name, target_doc=None): "Purchase Taxes and Charges": { "doctype": "Purchase Taxes and Charges", "add_if_empty": True - }, - "Payment Schedule": { - "doctype": "Payment Schedule", - "add_if_empty": True } - }, target_doc, postprocess) + } + + if frappe.get_single("Fetch Payment Terms").fetch_payment_terms == 1: + fields["Payment Schedule"] = { + "doctype": "Payment Schedule", + "add_if_empty": True + } + + doc = get_mapped_doc("Purchase Order", source_name, fields, target_doc, postprocess) return doc diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py index 42d0df0a06f..f3cf8a28880 100644 --- a/erpnext/config/accounts.py +++ b/erpnext/config/accounts.py @@ -297,7 +297,13 @@ def get_data(): "name": "C-Form", "description": _("C-Form records"), "country": "India" - } + }, + { + "type": "doctype", + "name": "Fetch Payment Terms", + "label": _("Fetch Payment Terms"), + "description": _("Fetch Payment Terms") + }, ] }, { From 2b54cee4aaf7ec95032b90c1e4357937e7ec2d07 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 17 Apr 2019 12:09:19 +0530 Subject: [PATCH 16/41] fix: test case --- .../buying/doctype/purchase_order/test_purchase_order.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/buying/doctype/purchase_order/test_purchase_order.py b/erpnext/buying/doctype/purchase_order/test_purchase_order.py index 8a472700f58..c7401faeb2d 100644 --- a/erpnext/buying/doctype/purchase_order/test_purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/test_purchase_order.py @@ -276,7 +276,7 @@ class TestPurchaseOrder(unittest.TestCase): pi = make_purchase_invoice(po.name) - self.assertTrue(pi.get('payment_schedule')) + self.assertFalse(pi.get('payment_schedule')) def test_terms_copied(self): po = create_purchase_order(do_not_save=1) @@ -294,6 +294,10 @@ class TestPurchaseOrder(unittest.TestCase): make_stock_entry(target="_Test Warehouse - _TC", qty=10, basic_rate=100) make_stock_entry(target="_Test Warehouse - _TC", item_code="_Test Item Home Desktop 100", qty=20, basic_rate=100) + make_stock_entry(target="_Test Warehouse 1 - _TC", item_code="_Test Item", + qty=30, basic_rate=100) + make_stock_entry(target="_Test Warehouse 1 - _TC", item_code="_Test Item Home Desktop 100", + qty=30, basic_rate=100) bin1 = frappe.db.get_value("Bin", filters={"warehouse": "_Test Warehouse - _TC", "item_code": "_Test Item"}, From 308ae1f15584bb62f0e097f1a4afae3851f42a0f Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 17 Apr 2019 12:42:00 +0530 Subject: [PATCH 17/41] fix: codacy fixes --- .../doctype/fetch_payment_terms/fetch_payment_terms.js | 3 --- .../doctype/fetch_payment_terms/fetch_payment_terms.py | 1 - .../doctype/fetch_payment_terms/test_fetch_payment_terms.py | 1 - erpnext/buying/doctype/purchase_order/purchase_order.py | 6 +++--- 4 files changed, 3 insertions(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js index faa011c9fe3..d16535a2d8c 100644 --- a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js +++ b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js @@ -2,7 +2,4 @@ // For license information, please see license.txt frappe.ui.form.on('Fetch Payment Terms', { - refresh: function(frm) { - - } }); diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py index c7bdd177e7e..fb2b1467c9b 100644 --- a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py +++ b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py @@ -3,7 +3,6 @@ # For license information, please see license.txt from __future__ import unicode_literals -import frappe from frappe.model.document import Document class FetchPaymentTerms(Document): diff --git a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py index 771a44c208e..86d500466f1 100644 --- a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py +++ b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py @@ -3,7 +3,6 @@ # See license.txt from __future__ import unicode_literals -import frappe import unittest class TestFetchPaymentTerms(unittest.TestCase): diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 27bce5b828a..78113d7dad3 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -421,9 +421,9 @@ def make_purchase_invoice(source_name, target_doc=None): if frappe.get_single("Fetch Payment Terms").fetch_payment_terms == 1: fields["Payment Schedule"] = { - "doctype": "Payment Schedule", - "add_if_empty": True - } + "doctype": "Payment Schedule", + "add_if_empty": True + } doc = get_mapped_doc("Purchase Order", source_name, fields, target_doc, postprocess) From 1865e0df7c0f2f7af7009d0901554e81ecbecf28 Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Wed, 17 Apr 2019 15:35:43 +0530 Subject: [PATCH 18/41] refactor: fetch payment terms in account settings --- .../accounts_settings/accounts_settings.json | 1384 +++++++++-------- .../doctype/fetch_payment_terms/__init__.py | 0 .../fetch_payment_terms.js | 5 - .../fetch_payment_terms.json | 96 -- .../fetch_payment_terms.py | 9 - .../test_fetch_payment_terms.js | 23 - .../test_fetch_payment_terms.py | 9 - .../doctype/purchase_order/purchase_order.py | 2 +- erpnext/config/accounts.py | 8 +- 9 files changed, 720 insertions(+), 816 deletions(-) delete mode 100644 erpnext/accounts/doctype/fetch_payment_terms/__init__.py delete mode 100644 erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js delete mode 100644 erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json delete mode 100644 erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py delete mode 100644 erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js delete mode 100644 erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 1fc226575f3..5ace0dc6fe6 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -1,717 +1,769 @@ { - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2013-06-24 15:49:57", - "custom": 0, - "description": "Settings for Accounts", - "docstatus": 0, - "doctype": "DocType", - "document_type": "Other", - "editable_grid": 1, - "engine": "InnoDB", + "allow_copy": 0, + "allow_events_in_timeline": 0, + "allow_guest_to_view": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2013-06-24 15:49:57", + "custom": 0, + "description": "Settings for Accounts", + "docstatus": 0, + "doctype": "DocType", + "document_type": "Other", + "editable_grid": 1, + "engine": "InnoDB", "fields": [ { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "description": "If enabled, the system will post accounting entries for inventory automatically.", - "fieldname": "auto_accounting_for_stock", - "fieldtype": "Check", - "hidden": 1, - "ignore_user_permissions": 0, - "ignore_xss_filter": 0, - "in_filter": 0, - "in_global_search": 0, - "in_list_view": 1, - "in_standard_filter": 0, - "label": "Make Accounting Entry For Every Stock Movement", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "description": "If enabled, the system will post accounting entries for inventory automatically.", + "fetch_if_empty": 0, + "fieldname": "auto_accounting_for_stock", + "fieldtype": "Check", + "hidden": 1, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_global_search": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Make Accounting Entry For Every Stock Movement", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Accounting entry frozen up to this date, nobody can do / modify entry except role specified below.", - "fieldname": "acc_frozen_upto", - "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": "Accounts Frozen Upto", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Accounting entry frozen up to this date, nobody can do / modify entry except role specified below.", + "fetch_if_empty": 0, + "fieldname": "acc_frozen_upto", + "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": "Accounts Frozen Upto", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Users with this role are allowed to set frozen accounts and create / modify accounting entries against frozen accounts", - "fieldname": "frozen_accounts_modifier", - "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": "Role Allowed to Set Frozen Accounts & Edit Frozen Entries", - "length": 0, - "no_copy": 0, - "options": "Role", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Users with this role are allowed to set frozen accounts and create / modify accounting entries against frozen accounts", + "fetch_if_empty": 0, + "fieldname": "frozen_accounts_modifier", + "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": "Role Allowed to Set Frozen Accounts & Edit Frozen Entries", + "length": 0, + "no_copy": 0, + "options": "Role", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_4", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "column_break_4", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "description": "Role that is allowed to submit transactions that exceed credit limits set.", - "fieldname": "credit_controller", - "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": "Credit Controller", - "length": 0, - "no_copy": 0, - "options": "Role", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "description": "Role that is allowed to submit transactions that exceed credit limits set.", + "fetch_if_empty": 0, + "fieldname": "credit_controller", + "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": "Credit Controller", + "length": 0, + "no_copy": 0, + "options": "Role", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "check_supplier_invoice_uniqueness", - "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": "Check Supplier Invoice Number Uniqueness", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "check_supplier_invoice_uniqueness", + "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": "Check Supplier Invoice Number Uniqueness", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "make_payment_via_journal_entry", - "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": "Make Payment via Journal Entry", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "make_payment_via_journal_entry", + "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": "Make Payment via Journal Entry", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "unlink_payment_on_cancellation_of_invoice", - "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": "Unlink Payment on Cancellation of Invoice", - "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, + "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": "unlink_payment_on_cancellation_of_invoice", + "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": "Unlink Payment on Cancellation of Invoice", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "book_asset_depreciation_entry_automatically", - "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": "Book Asset Depreciation Entry Automatically", - "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, + "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": "book_asset_depreciation_entry_automatically", + "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": "Book Asset Depreciation Entry Automatically", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "allow_cost_center_in_entry_of_bs_account", - "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": "Allow Cost Center In Entry of Balance Sheet Account", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "allow_cost_center_in_entry_of_bs_account", + "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": "Allow Cost Center In Entry of Balance Sheet Account", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "print_settings", - "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": "Print Settings", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "automatically_fetch_payment_terms", + "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": "Automatically Fetch Payment Terms", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "show_inclusive_tax_in_print", - "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 Inclusive Tax In Print", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "print_settings", + "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": "Print Settings", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "column_break_12", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "show_inclusive_tax_in_print", + "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 Inclusive Tax In Print", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "show_payment_schedule_in_print", - "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 Payment Schedule in Print", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "column_break_12", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "currency_exchange_section", - "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": "Currency Exchange Settings", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "show_payment_schedule_in_print", + "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 Payment Schedule in Print", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "fieldname": "allow_stale", - "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": "Allow Stale Exchange Rates", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "currency_exchange_section", + "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": "Currency Exchange Settings", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "1", - "depends_on": "eval:doc.allow_stale==0", - "fieldname": "stale_days", - "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": "Stale Days", - "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, + "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": "allow_stale", + "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": "Allow Stale Exchange Rates", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "fieldname": "report_settings_sb", - "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": "Report Settings", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "depends_on": "eval:doc.allow_stale==0", + "fetch_if_empty": 0, + "fieldname": "stale_days", + "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": "Stale Days", + "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 - }, + }, { - "allow_bulk_edit": 0, - "allow_in_quick_entry": 0, - "allow_on_submit": 0, - "bold": 0, - "collapsible": 0, - "columns": 0, - "default": "0", - "description": "Only select if you have setup Cash Flow Mapper documents", - "fieldname": "use_custom_cash_flow", - "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": "Use Custom Cash Flow Format", - "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, + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fetch_if_empty": 0, + "fieldname": "report_settings_sb", + "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": "Report Settings", + "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 + }, + { + "allow_bulk_edit": 0, + "allow_in_quick_entry": 0, + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "0", + "description": "Only select if you have setup Cash Flow Mapper documents", + "fetch_if_empty": 0, + "fieldname": "use_custom_cash_flow", + "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": "Use Custom Cash Flow Format", + "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 } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "icon": "icon-cog", - "idx": 1, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2019-01-07 16:52:03.869199", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Accounts Settings", - "owner": "Administrator", + ], + "has_web_view": 0, + "hide_heading": 0, + "hide_toolbar": 0, + "icon": "icon-cog", + "idx": 1, + "image_view": 0, + "in_create": 0, + "is_submittable": 0, + "issingle": 1, + "istable": 0, + "max_attachments": 0, + "modified": "2019-04-17 05:58:23.012494", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Accounts Settings", + "owner": "Administrator", "permissions": [ { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 0, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "Accounts Manager", - "set_user_permissions": 0, - "share": 1, - "submit": 0, + "amend": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 0, + "role": "Accounts Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, "write": 1 - }, + }, { - "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": "Sales User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "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": "Sales User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 - }, + }, { - "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": "Purchase User", - "set_user_permissions": 0, - "share": 0, - "submit": 0, + "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": "Purchase User", + "set_user_permissions": 0, + "share": 0, + "submit": 0, "write": 0 } - ], - "quick_entry": 1, - "read_only": 0, - "read_only_onload": 0, - "show_name_in_global_search": 0, - "sort_order": "ASC", - "track_changes": 1, - "track_seen": 0, + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "show_name_in_global_search": 0, + "sort_order": "ASC", + "track_changes": 1, + "track_seen": 0, "track_views": 0 } \ No newline at end of file diff --git a/erpnext/accounts/doctype/fetch_payment_terms/__init__.py b/erpnext/accounts/doctype/fetch_payment_terms/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js deleted file mode 100644 index d16535a2d8c..00000000000 --- a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.js +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors -// For license information, please see license.txt - -frappe.ui.form.on('Fetch Payment Terms', { -}); diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json deleted file mode 100644 index c1f83459f81..00000000000 --- a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.json +++ /dev/null @@ -1,96 +0,0 @@ -{ - "allow_copy": 0, - "allow_events_in_timeline": 0, - "allow_guest_to_view": 0, - "allow_import": 0, - "allow_rename": 0, - "beta": 0, - "creation": "2019-04-17 11:00:32.823034", - "custom": 0, - "docstatus": 0, - "doctype": "DocType", - "document_type": "", - "editable_grid": 0, - "engine": "InnoDB", - "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": "fetch_payment_terms", - "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": "Always Fetch Payment Terms", - "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 - } - ], - "has_web_view": 0, - "hide_heading": 0, - "hide_toolbar": 0, - "idx": 0, - "image_view": 0, - "in_create": 0, - "is_submittable": 0, - "issingle": 1, - "istable": 0, - "max_attachments": 0, - "modified": "2019-04-17 11:06:02.216048", - "modified_by": "Administrator", - "module": "Accounts", - "name": "Fetch Payment Terms", - "name_case": "", - "owner": "Administrator", - "permissions": [ - { - "amend": 0, - "cancel": 0, - "create": 1, - "delete": 1, - "email": 1, - "export": 0, - "if_owner": 0, - "import": 0, - "permlevel": 0, - "print": 1, - "read": 1, - "report": 0, - "role": "System Manager", - "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": 0, - "sort_field": "modified", - "sort_order": "ASC", - "track_changes": 1, - "track_seen": 0, - "track_views": 0 -} \ No newline at end of file diff --git a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py b/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py deleted file mode 100644 index fb2b1467c9b..00000000000 --- a/erpnext/accounts/doctype/fetch_payment_terms/fetch_payment_terms.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and contributors -# For license information, please see license.txt - -from __future__ import unicode_literals -from frappe.model.document import Document - -class FetchPaymentTerms(Document): - pass diff --git a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js deleted file mode 100644 index 80fd8e34f02..00000000000 --- a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -// rename this file from _test_[name] to test_[name] to activate -// and remove above this line - -QUnit.test("test: Fetch Payment Terms", function (assert) { - let done = assert.async(); - - // number of asserts - assert.expect(1); - - frappe.run_serially([ - // insert a new Fetch Payment Terms - () => frappe.tests.make('Fetch Payment Terms', [ - // values to be set - {key: 'value'} - ]), - () => { - assert.equal(cur_frm.doc.key, 'value'); - }, - () => done() - ]); - -}); diff --git a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py b/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py deleted file mode 100644 index 86d500466f1..00000000000 --- a/erpnext/accounts/doctype/fetch_payment_terms/test_fetch_payment_terms.py +++ /dev/null @@ -1,9 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2019, Frappe Technologies Pvt. Ltd. and Contributors -# See license.txt -from __future__ import unicode_literals - -import unittest - -class TestFetchPaymentTerms(unittest.TestCase): - pass diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 78113d7dad3..6e452350de6 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -419,7 +419,7 @@ def make_purchase_invoice(source_name, target_doc=None): } } - if frappe.get_single("Fetch Payment Terms").fetch_payment_terms == 1: + if frappe.get_single("Accounts Settings").automatically_fetch_payment_terms == 1: fields["Payment Schedule"] = { "doctype": "Payment Schedule", "add_if_empty": True diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py index f3cf8a28880..42d0df0a06f 100644 --- a/erpnext/config/accounts.py +++ b/erpnext/config/accounts.py @@ -297,13 +297,7 @@ def get_data(): "name": "C-Form", "description": _("C-Form records"), "country": "India" - }, - { - "type": "doctype", - "name": "Fetch Payment Terms", - "label": _("Fetch Payment Terms"), - "description": _("Fetch Payment Terms") - }, + } ] }, { From 22ad81fb5758067b658a9faed9e8ee7a44518d5c Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Thu, 18 Apr 2019 15:45:47 +0530 Subject: [PATCH 19/41] fix: Remove unwanted parent & parenttype field (#17274) --- .../print_format/credit_note/credit_note.json | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/erpnext/accounts/print_format/credit_note/credit_note.json b/erpnext/accounts/print_format/credit_note/credit_note.json index 863d4aa6073..c5a11cf3958 100644 --- a/erpnext/accounts/print_format/credit_note/credit_note.json +++ b/erpnext/accounts/print_format/credit_note/credit_note.json @@ -1,19 +1,23 @@ { - "creation": "2014-08-28 11:11:39.796473", - "custom_format": 0, - "disabled": 0, - "doc_type": "Journal Entry", - "docstatus": 0, - "doctype": "Print Format", - "html": "{%- from \"templates/print_formats/standard_macros.html\" import add_header -%}\n\n
\n {%- if not doc.get(\"print_heading\") and not doc.get(\"select_print_heading\") \n and doc.set(\"select_print_heading\", _(\"Credit Note\")) -%}{%- endif -%}\n {{ add_header(0, 1, doc, letter_head, no_letterhead) }}\n\n {%- for label, value in (\n (_(\"Credit To\"), doc.pay_to_recd_from),\n (_(\"Date\"), frappe.utils.formatdate(doc.voucher_date)),\n (_(\"Amount\"), \"\" + doc.get_formatted(\"total_amount\") + \"
\" + (doc.total_amount_in_words or \"\") + \"
\"),\n (_(\"Remarks\"), doc.remark)\n ) -%}\n\n
\n
\n
{{ value }}
\n
\n\n {%- endfor -%}\n\n
\n
\n

\n {{ _(\"For\") }} {{ doc.company }},
\n
\n
\n
\n {{ _(\"Authorized Signatory\") }}\n

\n
\n\n\n", - "idx": 2, - "modified": "2015-07-22 17:42:01.560817", - "modified_by": "Administrator", - "name": "Credit Note", - "owner": "Administrator", - "parent": "Journal Entry", - "parentfield": "__print_formats", - "parenttype": "DocType", - "print_format_type": "Server", + "align_labels_right": 0, + "creation": "2014-08-28 11:11:39.796473", + "custom_format": 0, + "disabled": 0, + "doc_type": "Journal Entry", + "docstatus": 0, + "doctype": "Print Format", + "format_data": "[{\"fieldname\": \"print_heading_template\", \"fieldtype\": \"Custom HTML\", \"options\": \"
\\t\\t\\t\\t

Journal Entry
{{ doc.name }}\\t\\t\\t\\t

\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"voucher_type\", \"print_hide\": 0, \"label\": \"Entry Type\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"posting_date\", \"print_hide\": 0, \"label\": \"Posting Date\"}, {\"fieldname\": \"finance_book\", \"print_hide\": 0, \"label\": \"Finance Book\"}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"accounts\", \"print_hide\": 0, \"label\": \"Accounting Entries\", \"visible_columns\": [{\"fieldname\": \"account\", \"print_width\": \"250px\", \"print_hide\": 0}, {\"fieldname\": \"bank_account_no\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"party_type\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"party\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"debit_in_account_currency\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"credit_in_account_currency\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"reference_type\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"reference_name\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"reference_due_date\", \"print_width\": \"\", \"print_hide\": 0}, {\"fieldname\": \"project\", \"print_width\": \"\", \"print_hide\": 0}]}, {\"fieldtype\": \"Section Break\", \"label\": \"\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"cheque_no\", \"print_hide\": 0, \"label\": \"Reference Number\"}, {\"fieldname\": \"cheque_date\", \"print_hide\": 0, \"label\": \"Reference Date\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"get_balance\", \"print_hide\": 0, \"label\": \"Make Difference Entry\"}, {\"fieldname\": \"total_amount\", \"print_hide\": 0, \"label\": \"Total Amount\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Reference\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"clearance_date\", \"print_hide\": 0, \"label\": \"Clearance Date\"}, {\"fieldname\": \"remark\", \"print_hide\": 0, \"label\": \"Remark\"}, {\"fieldname\": \"inter_company_journal_entry_reference\", \"print_hide\": 0, \"label\": \"Inter Company Journal Entry Reference\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"due_date\", \"print_hide\": 0, \"label\": \"Due Date\"}, {\"fieldtype\": \"Section Break\", \"label\": \"Printing Settings\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"pay_to_recd_from\", \"print_hide\": 0, \"label\": \"Pay To / Recd From\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"letter_head\", \"print_hide\": 0, \"label\": \"Letter Head\"}, {\"fieldtype\": \"Section Break\", \"label\": \"More Information\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"mode_of_payment\", \"print_hide\": 0, \"label\": \"Mode of Payment\"}, {\"fieldtype\": \"Column Break\"}, {\"fieldname\": \"stock_entry\", \"print_hide\": 0, \"label\": \"Stock Entry\"}]", + "html": "{%- from \"templates/print_formats/standard_macros.html\" import add_header -%}\n\n
\n {%- if not doc.get(\"print_heading\") and not doc.get(\"select_print_heading\") \n and doc.set(\"select_print_heading\", _(\"Credit Note\")) -%}{%- endif -%}\n {{ add_header(0, 1, doc, letter_head, no_letterhead) }}\n\n {%- for label, value in (\n (_(\"Credit To\"), doc.pay_to_recd_from),\n (_(\"Date\"), frappe.utils.formatdate(doc.voucher_date)),\n (_(\"Amount\"), \"\" + doc.get_formatted(\"total_amount\") + \"
\" + (doc.total_amount_in_words or \"\") + \"
\"),\n (_(\"Remarks\"), doc.remark)\n ) -%}\n\n
\n
\n
{{ value }}
\n
\n\n {%- endfor -%}\n\n
\n
\n

\n {{ _(\"For\") }} {{ doc.company }},
\n
\n
\n
\n {{ _(\"Authorized Signatory\") }}\n

\n
\n\n\n", + "idx": 2, + "line_breaks": 0, + "modified": "2019-04-18 12:10:14.732269", + "modified_by": "Administrator", + "module": "Accounts", + "name": "Credit Note", + "owner": "Administrator", + "parentfield": "__print_formats", + "print_format_builder": 0, + "print_format_type": "Server", + "show_section_headings": 0, "standard": "Yes" } \ No newline at end of file From abf9ef02449c3a108a8f7ec9abbf986e26852212 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 18 Apr 2019 22:01:33 +0530 Subject: [PATCH 20/41] fix: credit amount in account's currency not be consider if debit amount is present in the general ledger --- erpnext/accounts/report/utils.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/utils.py b/erpnext/accounts/report/utils.py index 8a397447383..8500aea4159 100644 --- a/erpnext/accounts/report/utils.py +++ b/erpnext/accounts/report/utils.py @@ -112,13 +112,15 @@ def convert_to_presentation_currency(gl_entries, currency_info): if entry.get('debit'): entry['debit'] = converted_value - else: + + if entry.get('credit'): entry['credit'] = converted_value elif account_currency == presentation_currency: if entry.get('debit'): entry['debit'] = debit_in_account_currency - else: + + if entry.get('credit'): entry['credit'] = credit_in_account_currency converted_gl_list.append(entry) From 4db4f21d167b80a98d6581a40fb8f9a6e8369c85 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 18 Apr 2019 22:34:19 +0530 Subject: [PATCH 21/41] fix: task name was not able to search by name in global search --- erpnext/projects/doctype/task/task.json | 45 +++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/erpnext/projects/doctype/task/task.json b/erpnext/projects/doctype/task/task.json index c22a2962c87..5fc72c43042 100644 --- a/erpnext/projects/doctype/task/task.json +++ b/erpnext/projects/doctype/task/task.json @@ -1,5 +1,6 @@ { "allow_copy": 0, + "allow_events_in_timeline": 0, "allow_guest_to_view": 0, "allow_import": 1, "allow_rename": 0, @@ -19,6 +20,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "subject", "fieldtype": "Data", "hidden": 0, @@ -51,6 +53,7 @@ "bold": 1, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "project", "fieldtype": "Link", "hidden": 0, @@ -86,6 +89,7 @@ "collapsible": 0, "columns": 0, "default": "0", + "fetch_if_empty": 0, "fieldname": "is_group", "fieldtype": "Check", "hidden": 0, @@ -118,6 +122,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break0", "fieldtype": "Column Break", "hidden": 0, @@ -151,6 +156,7 @@ "bold": 1, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "status", "fieldtype": "Select", "hidden": 0, @@ -185,6 +191,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "priority", "fieldtype": "Select", "hidden": 0, @@ -219,6 +226,7 @@ "bold": 1, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "parent_task", "fieldtype": "Link", "hidden": 0, @@ -254,6 +262,7 @@ "collapsible_depends_on": "", "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "section_break_10", "fieldtype": "Section Break", "hidden": 0, @@ -286,6 +295,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "exp_start_date", "fieldtype": "Date", "hidden": 0, @@ -322,6 +332,7 @@ "default": "0", "depends_on": "", "description": "", + "fetch_if_empty": 0, "fieldname": "expected_time", "fieldtype": "Float", "hidden": 0, @@ -356,6 +367,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "task_weight", "fieldtype": "Float", "hidden": 0, @@ -388,6 +400,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_11", "fieldtype": "Column Break", "hidden": 0, @@ -420,6 +433,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "exp_end_date", "fieldtype": "Date", "hidden": 0, @@ -454,6 +468,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "progress", "fieldtype": "Percent", "hidden": 0, @@ -487,6 +502,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "is_milestone", "fieldtype": "Check", "hidden": 0, @@ -519,6 +535,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "color", "fieldtype": "Color", "hidden": 0, @@ -553,6 +570,7 @@ "collapsible_depends_on": "", "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "section_break0", "fieldtype": "Section Break", "hidden": 0, @@ -586,6 +604,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "description", "fieldtype": "Text Editor", "hidden": 0, @@ -623,6 +642,7 @@ "collapsible_depends_on": "", "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "section_break", "fieldtype": "Section Break", "hidden": 0, @@ -656,6 +676,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "depends_on", "fieldtype": "Table", "hidden": 0, @@ -690,6 +711,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "depends_on_tasks", "fieldtype": "Data", "hidden": 1, @@ -725,6 +747,7 @@ "columns": 0, "depends_on": "", "description": "", + "fetch_if_empty": 0, "fieldname": "actual", "fieldtype": "Section Break", "hidden": 0, @@ -760,6 +783,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "act_start_date", "fieldtype": "Date", "hidden": 0, @@ -796,6 +820,7 @@ "default": "", "depends_on": "", "description": "", + "fetch_if_empty": 0, "fieldname": "actual_time", "fieldtype": "Float", "hidden": 0, @@ -829,6 +854,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_15", "fieldtype": "Column Break", "hidden": 0, @@ -861,6 +887,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "act_end_date", "fieldtype": "Date", "hidden": 0, @@ -895,6 +922,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "section_break_17", "fieldtype": "Section Break", "hidden": 0, @@ -927,6 +955,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "total_costing_amount", "fieldtype": "Currency", "hidden": 0, @@ -962,6 +991,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "total_expense_claim", "fieldtype": "Currency", "hidden": 0, @@ -995,6 +1025,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_20", "fieldtype": "Column Break", "hidden": 0, @@ -1027,6 +1058,7 @@ "collapsible": 0, "columns": 0, "depends_on": "", + "fetch_if_empty": 0, "fieldname": "total_billing_amount", "fieldtype": "Currency", "hidden": 0, @@ -1059,6 +1091,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "more_details", "fieldtype": "Section Break", "hidden": 0, @@ -1091,6 +1124,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"", + "fetch_if_empty": 0, "fieldname": "review_date", "fieldtype": "Date", "hidden": 0, @@ -1125,6 +1159,7 @@ "collapsible": 0, "columns": 0, "depends_on": "eval:doc.status == \"Closed\"", + "fetch_if_empty": 0, "fieldname": "closing_date", "fieldtype": "Date", "hidden": 0, @@ -1158,6 +1193,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "column_break_22", "fieldtype": "Column Break", "hidden": 0, @@ -1188,6 +1224,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "department", "fieldtype": "Link", "hidden": 0, @@ -1221,6 +1258,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "company", "fieldtype": "Link", "hidden": 0, @@ -1253,6 +1291,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "lft", "fieldtype": "Int", "hidden": 1, @@ -1285,6 +1324,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "rgt", "fieldtype": "Int", "hidden": 1, @@ -1317,6 +1357,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "old_parent", "fieldtype": "Data", "hidden": 1, @@ -1355,7 +1396,7 @@ "istable": 0, "max_attachments": 5, "menu_index": 0, - "modified": "2018-08-21 16:15:56.299895", + "modified": "2019-04-18 22:33:03.798331", "modified_by": "Administrator", "module": "Projects", "name": "Task", @@ -1385,7 +1426,7 @@ "read_only": 0, "read_only_onload": 0, "search_fields": "subject", - "show_name_in_global_search": 0, + "show_name_in_global_search": 1, "sort_order": "DESC", "timeline_field": "project", "title_field": "subject", From 6f54a7b7d88b48ba965218f43c511e12540f28c8 Mon Sep 17 00:00:00 2001 From: Sun Howwrongbum Date: Fri, 19 Apr 2019 01:44:35 +0530 Subject: [PATCH 22/41] fix: scan_barcode field adding invalid items --- erpnext/public/js/controllers/transaction.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 168a727f270..ec4e4b7b83b 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -290,7 +290,7 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({ args: { search_value: this.frm.doc.scan_barcode } }).then(r => { const data = r && r.message; - if (!data) { + if (!data || Object.keys(data).length === 0) { scan_barcode_field.set_new_description(__('Cannot find Item with this barcode')); return; } From df16cdcf3192bec8af453a0fb0cad5060218d9d3 Mon Sep 17 00:00:00 2001 From: Raffael Meyer Date: Fri, 19 Apr 2019 00:21:44 +0200 Subject: [PATCH 23/41] fix(test): provide a helpful error message --- erpnext/setup/doctype/company/test_company.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py index 1b08a228b6c..8debef5ff69 100644 --- a/erpnext/setup/doctype/company/test_company.py +++ b/erpnext/setup/doctype/company/test_company.py @@ -4,6 +4,8 @@ from __future__ import unicode_literals import frappe import unittest +import json +from frappe import _ from frappe.utils import random_string from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import get_charts_for_country @@ -78,7 +80,10 @@ class TestCompany(unittest.TestCase): if account_type in ["Bank", "Cash"]: filters["is_group"] = 1 - self.assertTrue(frappe.get_all("Account", filters)) + has_matching_accounts = frappe.get_all("Account", filters) + error_message = _("No Account matched these filters: {}".format(json.dumps(filters))) + + self.assertTrue(has_matching_accounts, msg=error_message) finally: self.delete_mode_of_payment(template) frappe.delete_doc("Company", template) From e85c6ad236b2acb9279862f9caddf1c672a6bac8 Mon Sep 17 00:00:00 2001 From: Prasad R Date: Fri, 19 Apr 2019 10:57:21 +0530 Subject: [PATCH 24/41] fix: Allow system manager to access share ledger --- erpnext/accounts/report/share_ledger/share_ledger.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/report/share_ledger/share_ledger.json b/erpnext/accounts/report/share_ledger/share_ledger.json index d374bb7747c..fe158a6f003 100644 --- a/erpnext/accounts/report/share_ledger/share_ledger.json +++ b/erpnext/accounts/report/share_ledger/share_ledger.json @@ -1,23 +1,27 @@ { "add_total_row": 0, - "apply_user_permissions": 1, "creation": "2017-12-27 16:15:52.615453", + "disable_prepared_report": 0, "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 0, "is_standard": "Yes", - "modified": "2017-12-27 16:46:54.422356", + "modified": "2019-04-19 10:50:36.061588", "modified_by": "Administrator", "module": "Accounts", "name": "Share Ledger", "owner": "Administrator", + "prepared_report": 0, "ref_doctype": "Share Transfer", "report_name": "Share Ledger", "report_type": "Script Report", "roles": [ { "role": "Administrator" + }, + { + "role": "System Manager" } ] } \ No newline at end of file From ce291c253bbbb8dfbfc47579527ffb618cedea2c Mon Sep 17 00:00:00 2001 From: Prasad R Date: Fri, 19 Apr 2019 12:17:19 +0530 Subject: [PATCH 25/41] fix: show 2 missing doctypes in Accounts Pricing Term and Exchage Rate Revaluation were missing, added in list --- erpnext/config/accounts.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/erpnext/config/accounts.py b/erpnext/config/accounts.py index 31366b4f1b7..cd4edd8ccd6 100644 --- a/erpnext/config/accounts.py +++ b/erpnext/config/accounts.py @@ -27,6 +27,11 @@ def get_data(): "type": "doctype", "name": "Payment Entry", "description": _("Bank/Cash transactions against party or for internal transfer") + }, + { + "type": "doctype", + "name": "Payment Term", + "description": _("Payment Terms based on conditions") } ] @@ -284,6 +289,11 @@ def get_data(): "name": "Currency Exchange", "description": _("Currency exchange rate master.") }, + { + "type": "doctype", + "name": "Exchange Rate Revaluation", + "description": _("Exchange Rate Revaluation master.") + }, { "type": "doctype", "name": "Payment Gateway Account", From e86d21ea15a8e8da150c8ea2e933917dfe2e2c7b Mon Sep 17 00:00:00 2001 From: Charles-Henri Decultot Date: Fri, 19 Apr 2019 10:09:06 +0200 Subject: [PATCH 26/41] Py3 and matching corrections --- .../bank_transaction/bank_transaction.py | 1 + .../bank_transaction_upload.py | 7 +++--- .../bank_reconciliation.js | 1 - .../bank_reconciliation.py | 24 ++++++++++++------- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py index d8b5f00f6ee..0050ffc9df2 100644 --- a/erpnext/accounts/doctype/bank_transaction/bank_transaction.py +++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe.utils import flt +from six.moves import reduce class BankTransaction(Document): def after_insert(self): diff --git a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py index d5d8c0e0465..8dd8d286729 100644 --- a/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py +++ b/erpnext/accounts/doctype/bank_transaction/bank_transaction_upload.py @@ -7,6 +7,7 @@ import frappe import json from frappe.utils import getdate from frappe.utils.dateutils import parse_date +from six import iteritems @frappe.whitelist() def upload_bank_statement(): @@ -17,11 +18,11 @@ def upload_bank_statement(): from frappe.utils.file_manager import get_uploaded_content fname, fcontent = get_uploaded_content() - if frappe.safe_encode(fname).lower().endswith("csv"): + if frappe.safe_encode(fname).lower().endswith("csv".encode('utf-8')): from frappe.utils.csvutils import read_csv_content rows = read_csv_content(fcontent, False) - elif frappe.safe_encode(fname).lower().endswith("xlsx"): + elif frappe.safe_encode(fname).lower().endswith("xlsx".encode('utf-8')): from frappe.utils.xlsxutils import read_xlsx_file_from_attached_file rows = read_xlsx_file_from_attached_file(fcontent=fcontent) @@ -40,7 +41,7 @@ def create_bank_entries(columns, data, bank_account): if all(item is None for item in d) is True: continue fields = {} - for key, value in header_map.iteritems(): + for key, value in iteritems(header_map): fields.update({key: d[int(value)-1]}) diff --git a/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.js b/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.js index 5cb4bba6a55..c64e28fc218 100644 --- a/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.js +++ b/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.js @@ -32,7 +32,6 @@ erpnext.accounts.bankReconciliation = class BankReconciliation { fieldname: 'company', options: "Company", onchange: function() { - console.log(this.value) if (this.value) { me.company = this.value; } else { diff --git a/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py b/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py index e39cf9ea950..1f96bade762 100644 --- a/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py +++ b/erpnext/accounts/page/bank_reconciliation/bank_reconciliation.py @@ -83,7 +83,7 @@ def get_linked_payments(bank_transaction): amount_matching = check_matching_amount(bank_account[0].account, bank_account[0].company, transaction) # Get some data from payment entries linked to a corresponding bank transaction - description_matching = get_matching_descriptions_data(bank_account[0].account, transaction) + description_matching = get_matching_descriptions_data(bank_account[0].company, transaction) if amount_matching: return check_amount_vs_description(amount_matching, description_matching) @@ -207,7 +207,7 @@ def check_matching_amount(bank_account, company, transaction): return payments -def get_matching_descriptions_data(bank_account, transaction): +def get_matching_descriptions_data(company, transaction): if not transaction.description : return [] @@ -243,17 +243,23 @@ def get_matching_descriptions_data(bank_account, transaction): data = [] + company_currency = get_company_currency(company) for key, value in iteritems(links): if key == "Payment Entry": - data.extend(frappe.get_all("Payment Entry", filters=[["name", "in", value]], fields=["'Payment Entry' as doctype", "posting_date", "party", "reference_no", "reference_date", "paid_amount"])) + data.extend(frappe.get_all("Payment Entry", filters=[["name", "in", value]], fields=["'Payment Entry' as doctype", "posting_date", "party", "reference_no", "reference_date", "paid_amount", "paid_to_account_currency as currency"])) if key == "Journal Entry": - data.extend(frappe.get_all("Journal Entry", filters=[["name", "in", value]], fields=["'Journal Entry' as doctype", "posting_date", "paid_to_recd_from as party", "cheque_no as reference_no", "cheque_date as reference_date"])) + journal_entries = frappe.get_all("Journal Entry", filters=[["name", "in", value]], fields=["name", "'Journal Entry' as doctype", "posting_date", "paid_to_recd_from as party", "cheque_no as reference_no", "cheque_date as reference_date", "total_credit as paid_amount"]) + for journal_entry in journal_entries: + journal_entry_accounts = frappe.get_all("Journal Entry Account", filters={"parenttype": journal_entry["doctype"], "parent": journal_entry["name"]}, fields=["account_currency"]) + journal_entry["currency"] = journal_entry_accounts[0]["account_currency"] if journal_entry_accounts else company_currency + data.extend(journal_entries) if key == "Sales Invoice": - data.extend(frappe.get_all("Sales Invoice", filters=[["name", "in", value]], fields=["'Sales Invoice' as doctype", "posting_date", "customer_name as party"])) + data.extend(frappe.get_all("Sales Invoice", filters=[["name", "in", value]], fields=["'Sales Invoice' as doctype", "posting_date", "customer_name as party", "paid_amount", "currency"])) if key == "Purchase Invoice": - data.append(frappe.get_all("Purchase Invoice", filters=[["name", "in", value]], fields=["'Purchase Invoice' as doctype", "posting_date", "supplier_name as party"])) - if key == "Purchase Invoice": - data.append(frappe.get_all("Expense Claim", filters=[["name", "in", value]], fields=["'Expense Claim' as doctype", "posting_date", "employee_name as party"])) + data.extend(frappe.get_all("Purchase Invoice", filters=[["name", "in", value]], fields=["'Purchase Invoice' as doctype", "posting_date", "supplier_name as party", "paid_amount", "currency"])) + if key == "Expense Claim": + expense_claims = frappe.get_all("Expense Claim", filters=[["name", "in", value]], fields=["'Expense Claim' as doctype", "posting_date", "employee_name as party", "total_amount_reimbursed as paid_amount"]) + data.extend([dict(x,**{"currency": company_currency}) for x in expense_claims]) return data @@ -269,7 +275,7 @@ def check_amount_vs_description(amount_matching, description_matching): continue if hasattr(am_match, "reference_no") and hasattr(des_match, "reference_no"): - if difflib.SequenceMatcher(lambda x: x == " ", am_match["reference_no"], des_match["reference_no"]) > 70: + if difflib.SequenceMatcher(lambda x: x == " ", am_match["reference_no"], des_match["reference_no"]).ratio() > 70: if am_match not in result: result.append(am_match) if result: From d36e635e60661400dcd28c082f76704e63bc28d5 Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 18 Apr 2019 19:03:30 +0530 Subject: [PATCH 27/41] fix: Requested Items To Be Ordered report showing records even if material request is fully ordered --- .../requested_items_to_be_ordered.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.json b/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.json index f351f3b5735..55786ae4ccc 100644 --- a/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.json +++ b/erpnext/buying/report/requested_items_to_be_ordered/requested_items_to_be_ordered.json @@ -1,18 +1,19 @@ { "add_total_row": 1, - "apply_user_permissions": 1, "creation": "2013-05-13 16:10:02", + "disable_prepared_report": 0, "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 3, "is_standard": "Yes", - "modified": "2017-02-24 20:10:53.005589", + "modified": "2019-04-19 14:54:49.123836", "modified_by": "Administrator", "module": "Buying", "name": "Requested Items To Be Ordered", "owner": "Administrator", - "query": "select \n mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tsum(ifnull(mr_item.qty, 0)) as \"Qty:Float:100\",\n\tsum(ifnull(mr_item.ordered_qty, 0)) as \"Ordered Qty:Float:100\", \n\t(sum(mr_item.qty) - sum(ifnull(mr_item.ordered_qty, 0))) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\",\n\tmr.company as \"Company:Link/Company:\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\ngroup by mr.name, mr_item.item_code\nhaving\n\tsum(ifnull(mr_item.ordered_qty, 0)) < sum(ifnull(mr_item.qty, 0))\norder by mr.transaction_date asc", + "prepared_report": 0, + "query": "select \n mr.name as \"Material Request:Link/Material Request:120\",\n\tmr.transaction_date as \"Date:Date:100\",\n\tmr_item.item_code as \"Item Code:Link/Item:120\",\n\tsum(ifnull(mr_item.stock_qty, 0)) as \"Qty:Float:100\",\n\tifnull(mr_item.stock_uom, '') as \"UOM:Link/UOM:100\",\n\tsum(ifnull(mr_item.ordered_qty, 0)) as \"Ordered Qty:Float:100\", \n\t(sum(mr_item.stock_qty) - sum(ifnull(mr_item.ordered_qty, 0))) as \"Qty to Order:Float:100\",\n\tmr_item.item_name as \"Item Name::150\",\n\tmr_item.description as \"Description::200\",\n\tmr.company as \"Company:Link/Company:\"\nfrom\n\t`tabMaterial Request` mr, `tabMaterial Request Item` mr_item\nwhere\n\tmr_item.parent = mr.name\n\tand mr.material_request_type = \"Purchase\"\n\tand mr.docstatus = 1\n\tand mr.status != \"Stopped\"\ngroup by mr.name, mr_item.item_code\nhaving\n\tsum(ifnull(mr_item.ordered_qty, 0)) < sum(ifnull(mr_item.stock_qty, 0))\norder by mr.transaction_date asc", "ref_doctype": "Purchase Order", "report_name": "Requested Items To Be Ordered", "report_type": "Query Report", From 4f2fa173c900125970b1b3adacf233d9179b7a3e Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Fri, 19 Apr 2019 16:06:17 +0530 Subject: [PATCH 28/41] fix: Reopen button does not appear in delivery note (#17295) --- erpnext/stock/doctype/delivery_note/delivery_note.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js index 41e65d0497e..e8224eb458f 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.js +++ b/erpnext/stock/doctype/delivery_note/delivery_note.js @@ -101,8 +101,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend( refresh: function(doc, dt, dn) { var me = this; this._super(); - - if ((!doc.is_return) && (doc.status!="Closed" || doc.is_new())) { + if ((!doc.is_return) && (doc.status!="Closed" || this.frm.is_new())) { if (this.frm.doc.docstatus===0) { this.frm.add_custom_button(__('Sales Order'), function() { From 3dbaa3c2d9dfc30205f378c1db69afcd09d845f2 Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Fri, 19 Apr 2019 16:31:23 +0530 Subject: [PATCH 29/41] fix(site_sync): return more data in level --- erpnext/utilities/activation.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/erpnext/utilities/activation.py b/erpnext/utilities/activation.py index 16391e073e2..8e59bdc966b 100644 --- a/erpnext/utilities/activation.py +++ b/erpnext/utilities/activation.py @@ -48,7 +48,27 @@ def get_level(): if frappe.db.sql('select name from tabUser where last_login > date_sub(now(), interval 2 day) limit 1'): activation_level += 1 - return activation_level + level = {"activation_level": 10, "sales_data": [ + {"Item": frappe.db.count('Item')}, + {"Sales Order": frappe.db.count('Sales Order')}, + {"Purchase Order": frappe.db.count('Purchase Order')}, + {"Employee": frappe.db.count('Employee')}, + {"Lead": frappe.db.count('Lead')}, + {"Payment Entry": frappe.db.count('Payment Entry')}, + {"Communication": frappe.db.count('Communication')}, + {"User": frappe.db.count('User')}, + {"Student": frappe.db.count('Student')}, + {"Instructor": frappe.db.count('Instructor')}, + {"Sales Invoice": frappe.db.count('Sales Invoice')}, + {"BOM": frappe.db.count('BOM')}, + {"Quotation": frappe.db.count('Quotation')}, + {"Lead": frappe.db.count('Lead')}, + {"Payment Entry": frappe.db.count('Payment Entry')}, + {"Journal Entry": frappe.db.count('Journal Entry')}, + {"Stock Entry": frappe.db.count('Stock Entry')}, + ]} + + return level def get_help_messages(): '''Returns help messages to be shown on Desktop''' From d08953b72b8d8bb14e5b4636b290c92d6514cb25 Mon Sep 17 00:00:00 2001 From: Suraj Shetty Date: Fri, 19 Apr 2019 21:52:08 +0530 Subject: [PATCH 30/41] fix: Do not create employee user permission if already exists --- erpnext/hr/doctype/employee/employee.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/erpnext/hr/doctype/employee/employee.py b/erpnext/hr/doctype/employee/employee.py index d518cd89957..1fc51690c3a 100755 --- a/erpnext/hr/doctype/employee/employee.py +++ b/erpnext/hr/doctype/employee/employee.py @@ -80,6 +80,14 @@ class Employee(NestedSet): if not self.create_user_permission: return if not has_permission('User Permission', ptype='write'): return + employee_user_permission_exists = frappe.db.exists('User Permission', { + 'allow': 'Employee', + 'for_value': self.name, + 'user': self.user_id + }) + + if employee_user_permission_exists: return + add_user_permission("Employee", self.name, self.user_id) set_user_permission_if_allowed("Company", self.company, self.user_id) From dfba52b834b26773c440c03bb1410c5214172702 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Sat, 20 Apr 2019 10:57:04 +0530 Subject: [PATCH 31/41] fix: Total row alignment in AR report --- .../report/accounts_receivable/accounts_receivable.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html index 5ce80d1baf3..1bff93cb77e 100644 --- a/erpnext/accounts/report/accounts_receivable/accounts_receivable.html +++ b/erpnext/accounts/report/accounts_receivable/accounts_receivable.html @@ -107,8 +107,8 @@ {% if(report.report_name === "Accounts Receivable" || report.report_name === "Accounts Payable") { %} - {%= __("Date") %} - {%= __("Age (Days)") %} + {%= __("Date") %} + {%= __("Age (Days)") %} {% if(report.report_name === "Accounts Receivable" && filters.show_sales_person_in_print) { %} {%= __("Reference") %} @@ -206,7 +206,7 @@ {% if(!filters.show_pdc_in_print) { %} {% } %} - {% if(report.report_name === "Accounts Receivable") { %} + {% if(report.report_name === "Accounts Receivable" && filters.show_sales_person_in_print) { %} {% } %} From 4e81fb20b9a8a3997b735440e2fea5ca6b3eb162 Mon Sep 17 00:00:00 2001 From: rohitwaghchaure Date: Sat, 20 Apr 2019 11:50:45 +0530 Subject: [PATCH 32/41] fix: Move erpnext related methods from frappe to erpnext (#17293) --- erpnext/crm/doctype/lead/lead.py | 27 +++++++++++++++++++ .../crm/doctype/opportunity/opportunity.py | 22 +++++++++++++++ erpnext/public/js/communication.js | 6 ++--- erpnext/support/doctype/issue/issue.py | 18 +++++++++++++ 4 files changed, 70 insertions(+), 3 deletions(-) diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index 29ca71bd88e..2fa6b68ee20 100644 --- a/erpnext/crm/doctype/lead/lead.py +++ b/erpnext/crm/doctype/lead/lead.py @@ -10,6 +10,7 @@ from frappe.model.mapper import get_mapped_doc from erpnext.controllers.selling_controller import SellingController from frappe.contacts.address_and_contact import load_address_and_contact from erpnext.accounts.party import set_taxes +from frappe.email.inbox import link_communication_to_document sender_field = "email_id" @@ -199,3 +200,29 @@ def get_lead_details(lead, posting_date=None, company=None): out['taxes_and_charges'] = taxes_and_charges return out + +@frappe.whitelist() +def make_lead_from_communication(communication, ignore_communication_links=False): + """ raise a issue from email """ + + doc = frappe.get_doc("Communication", communication) + lead_name = None + if doc.sender: + lead_name = frappe.db.get_value("Lead", {"email_id": doc.sender}) + if not lead_name and doc.phone_no: + lead_name = frappe.db.get_value("Lead", {"mobile_no": doc.phone_no}) + if not lead_name: + lead = frappe.get_doc({ + "doctype": "Lead", + "lead_name": doc.sender_full_name, + "email_id": doc.sender, + "mobile_no": doc.phone_no + }) + lead.flags.ignore_mandatory = True + lead.flags.ignore_permissions = True + lead.insert() + + lead_name = lead.name + + link_communication_to_document(doc, "Lead", lead_name, ignore_communication_links) + return lead_name \ No newline at end of file diff --git a/erpnext/crm/doctype/opportunity/opportunity.py b/erpnext/crm/doctype/opportunity/opportunity.py index e8da4e6436b..c5aae9cd5f3 100644 --- a/erpnext/crm/doctype/opportunity/opportunity.py +++ b/erpnext/crm/doctype/opportunity/opportunity.py @@ -9,6 +9,7 @@ from frappe.model.mapper import get_mapped_doc from erpnext.setup.utils import get_exchange_rate from erpnext.utilities.transaction_base import TransactionBase from erpnext.accounts.party import get_party_account_currency +from frappe.email.inbox import link_communication_to_document subject_field = "title" sender_field = "contact_email" @@ -321,3 +322,24 @@ def auto_close_opportunity(): doc.flags.ignore_permissions = True doc.flags.ignore_mandatory = True doc.save() + +@frappe.whitelist() +def make_opportunity_from_communication(communication, ignore_communication_links=False): + from erpnext.crm.doctype.lead.lead import make_lead_from_communication + doc = frappe.get_doc("Communication", communication) + + lead = doc.reference_name if doc.reference_doctype == "Lead" else None + if not lead: + lead = make_lead_from_communication(communication, ignore_communication_links=True) + + enquiry_from = "Lead" + + opportunity = frappe.get_doc({ + "doctype": "Opportunity", + "enquiry_from": enquiry_from, + "lead": lead + }).insert(ignore_permissions=True) + + link_communication_to_document(doc, "Opportunity", opportunity.name, ignore_communication_links) + + return opportunity.name diff --git a/erpnext/public/js/communication.js b/erpnext/public/js/communication.js index e85107e77aa..02357ef086c 100644 --- a/erpnext/public/js/communication.js +++ b/erpnext/public/js/communication.js @@ -33,7 +33,7 @@ frappe.ui.form.on("Communication", { make_lead_from_communication: (frm) => { return frappe.call({ - method: "frappe.email.inbox.make_lead_from_communication", + method: "erpnext.crm.doctype.lead.lead.make_lead_from_communication", args: { communication: frm.doc.name }, @@ -48,7 +48,7 @@ frappe.ui.form.on("Communication", { make_issue_from_communication: (frm) => { return frappe.call({ - method: "frappe.email.inbox.make_issue_from_communication", + method: "erpnext.support.doctype.issue.issue.make_issue_from_communication", args: { communication: frm.doc.name }, @@ -63,7 +63,7 @@ frappe.ui.form.on("Communication", { make_opportunity_from_communication: (frm) => { return frappe.call({ - method: "frappe.email.inbox.make_opportunity_from_communication", + method: "erpnext.crm.doctype.opportunity.opportunity.make_opportunity_from_communication", args: { communication: frm.doc.name }, diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py index 0b5eb539c8d..2e74b997f61 100644 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -9,6 +9,7 @@ from frappe import _ from frappe.model.document import Document from frappe.utils import now from frappe.utils.user import is_website_user +from frappe.email.inbox import link_communication_to_document sender_field = "raised_by" @@ -160,3 +161,20 @@ def has_website_permission(doc, ptype, user, verbose=False): def update_issue(contact, method): """Called when Contact is deleted""" frappe.db.sql("""UPDATE `tabIssue` set contact='' where contact=%s""", contact.name) + +@frappe.whitelist() +def make_issue_from_communication(communication, ignore_communication_links=False): + """ raise a issue from email """ + + doc = frappe.get_doc("Communication", communication) + issue = frappe.get_doc({ + "doctype": "Issue", + "subject": doc.subject, + "communication_medium": doc.communication_medium, + "raised_by": doc.sender or "", + "raised_by_phone": doc.phone_no or "" + }).insert(ignore_permissions=True) + + link_communication_to_document(doc, "Issue", issue.name, ignore_communication_links) + + return issue.name \ No newline at end of file From 3889d0f0a0628e64e499d3840175b3ec9b6e0826 Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Sat, 20 Apr 2019 14:26:49 +0530 Subject: [PATCH 33/41] fix: refactor level --- erpnext/utilities/activation.py | 64 ++++++++------------------------- 1 file changed, 14 insertions(+), 50 deletions(-) diff --git a/erpnext/utilities/activation.py b/erpnext/utilities/activation.py index 8e59bdc966b..ea1b0ea3a6a 100644 --- a/erpnext/utilities/activation.py +++ b/erpnext/utilities/activation.py @@ -7,66 +7,30 @@ import frappe, erpnext from frappe import _ def get_level(): + activation_level = 0 + sales_data = [] + doctypes = {"Item": 5, "Customer": 5, "Sales Order": 2, "Sales Invoice": 2, "Purchase Order": 2, "Employee": 3, "Lead": 3, "Quotation": 3 + "Payment Entry": 2, "User": 5, "Student": 5, "Instructor": 5, "BOM": 3, "Journal Entry": 3, "Stock Entry": 3} + for doctype, min_count in iteritems(doctypes): + count = frappe.db.count(doctype) + if count > min_count: + activation_level += 1 + sales_data.append({doctype: count}) + if frappe.db.get_single_value('System Settings', 'setup_complete'): - activation_level = 1 - - if frappe.db.count('Item') > 5: activation_level += 1 - if frappe.db.count('Customer') > 5: - activation_level += 1 - - if frappe.db.count('Sales Order') > 2: - activation_level += 1 - - if frappe.db.count('Purchase Order') > 2: - activation_level += 1 - - if frappe.db.count('Employee') > 3: - activation_level += 1 - - if frappe.db.count('Lead') > 3: - activation_level += 1 - - if frappe.db.count('Payment Entry') > 2: - activation_level += 1 - - if frappe.db.count('Communication', dict(communication_medium='Email')) > 10: - activation_level += 1 - - if frappe.db.count('User') > 5: - activation_level += 1 - - if frappe.db.count('Student') > 5: - activation_level += 1 - - if frappe.db.count('Instructor') > 5: + communication_number = frappe.db.count('Communication', dict(communication_medium='Email')) + if communication_number > 10: activation_level += 1 + sales_data.append({"Communication": communication_number}) # recent login if frappe.db.sql('select name from tabUser where last_login > date_sub(now(), interval 2 day) limit 1'): activation_level += 1 - level = {"activation_level": 10, "sales_data": [ - {"Item": frappe.db.count('Item')}, - {"Sales Order": frappe.db.count('Sales Order')}, - {"Purchase Order": frappe.db.count('Purchase Order')}, - {"Employee": frappe.db.count('Employee')}, - {"Lead": frappe.db.count('Lead')}, - {"Payment Entry": frappe.db.count('Payment Entry')}, - {"Communication": frappe.db.count('Communication')}, - {"User": frappe.db.count('User')}, - {"Student": frappe.db.count('Student')}, - {"Instructor": frappe.db.count('Instructor')}, - {"Sales Invoice": frappe.db.count('Sales Invoice')}, - {"BOM": frappe.db.count('BOM')}, - {"Quotation": frappe.db.count('Quotation')}, - {"Lead": frappe.db.count('Lead')}, - {"Payment Entry": frappe.db.count('Payment Entry')}, - {"Journal Entry": frappe.db.count('Journal Entry')}, - {"Stock Entry": frappe.db.count('Stock Entry')}, - ]} + level = {"activation_level": activation_level, "sales_data": sales_data} return level From a26e2c064a70971e6bfee9d9ac5ad432427c3314 Mon Sep 17 00:00:00 2001 From: Don-Leopardo <46027152+Don-Leopardo@users.noreply.github.com> Date: Sat, 20 Apr 2019 12:42:23 -0300 Subject: [PATCH 34/41] fix: Campaign Efficiency report only works in english (#17284) * fix column translation and match * fix float results * fix import missing --- .../campaign_efficiency.py | 88 ++++++++++++++----- 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py b/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py index b20fe15ce27..52b848ed504 100644 --- a/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py +++ b/erpnext/crm/report/campaign_efficiency/campaign_efficiency.py @@ -4,24 +4,70 @@ from __future__ import unicode_literals import frappe from frappe import _ +from frappe.utils import flt def execute(filters=None): columns, data = [], [] - columns=get_columns() - data=get_lead_data(filters, "Campaign Name") + columns=get_columns("Campaign Name") + data=get_lead_data(filters or {}, "Campaign Name") return columns, data -def get_columns(): +def get_columns(based_on): return [ - _("Campaign Name") + ":data:130", - _("Lead Count") + ":Int:80", - _("Opp Count") + ":Int:80", - _("Quot Count") + ":Int:80", - _("Order Count") + ":Int:100", - _("Order Value") + ":Float:100", - _("Opp/Lead %") + ":Float:100", - _("Quot/Lead %") + ":Float:100", - _("Order/Quot %") + ":Float:100" + { + "fieldname": frappe.scrub(based_on), + "label": _(based_on), + "fieldtype": "Data", + "width": 150 + }, + { + "fieldname": "lead_count", + "label": _("Lead Count"), + "fieldtype": "Int", + "width": 80 + }, + { + "fieldname": "opp_count", + "label": _("Opp Count"), + "fieldtype": "Int", + "width": 80 + }, + { + "fieldname": "quot_count", + "label": _("Quot Count"), + "fieldtype": "Int", + "width": 80 + }, + { + "fieldname": "order_count", + "label": _("Order Count"), + "fieldtype": "Int", + "width": 100 + }, + { + "fieldname": "order_value", + "label": _("Order Value"), + "fieldtype": "Float", + "width": 100 + }, + { + "fieldname": "opp_lead", + "label": _("Opp/Lead %"), + "fieldtype": "Float", + "width": 100 + }, + { + "fieldname": "quot_lead", + "label": _("Quot/Lead %"), + "fieldtype": "Float", + "width": 100 + }, + { + "fieldname": "order_quot", + "label": _("Order/Quot %"), + "fieldtype": "Float", + "width": 100 + } ] def get_lead_data(filters, based_on): @@ -41,18 +87,18 @@ def get_lead_data(filters, based_on): data = [] for based_on_value, leads in lead_map.items(): row = { - based_on: based_on_value, - "Lead Count": len(leads) + based_on_field: based_on_value, + "lead_count": len(leads) } - row["Quot Count"]= get_lead_quotation_count(leads) - row["Opp Count"] = get_lead_opp_count(leads) - row["Order Count"] = get_quotation_ordered_count(leads) - row["Order Value"] = get_order_amount(leads) + row["quot_count"]= get_lead_quotation_count(leads) + row["opp_count"] = get_lead_opp_count(leads) + row["order_count"] = get_quotation_ordered_count(leads) + row["order_value"] = get_order_amount(leads) or 0 - row["Opp/Lead %"] = row["Opp Count"] / row["Lead Count"] * 100 - row["Quot/Lead %"] = row["Quot Count"] / row["Lead Count"] * 100 + row["opp_lead"] = flt(row["opp_count"]) / flt(row["lead_count"] or 1.0) * 100.0 + row["quot_lead"] = flt(row["quot_count"]) / flt(row["lead_count"] or 1.0) * 100.0 - row["Order/Quot %"] = row["Order Count"] / (row["Quot Count"] or 1) * 100 + row["order_quot"] = flt(row["order_count"]) / flt(row["quot_count"] or 1.0) * 100.0 data.append(row) From c4a670c8c88807db0929298e9d33f244fa37ff17 Mon Sep 17 00:00:00 2001 From: Kenneth Sequeira <33246109+kennethsequeira@users.noreply.github.com> Date: Sat, 20 Apr 2019 21:44:38 +0530 Subject: [PATCH 35/41] add salutation in contact display for lead (#17312) --- erpnext/crm/doctype/lead/lead.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/crm/doctype/lead/lead.py b/erpnext/crm/doctype/lead/lead.py index 2fa6b68ee20..687caaaad83 100644 --- a/erpnext/crm/doctype/lead/lead.py +++ b/erpnext/crm/doctype/lead/lead.py @@ -186,7 +186,7 @@ def get_lead_details(lead, posting_date=None, company=None): out.update({ "territory": lead.territory, "customer_name": lead.company_name or lead.lead_name, - "contact_display": lead.lead_name, + "contact_display": " ".join(filter(None, [lead.salutation, lead.lead_name])), "contact_email": lead.email_id, "contact_mobile": lead.mobile_no, "contact_phone": lead.phone, From cb4b86512dc28386bcd76fb1e7c8dda65722d0cc Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Mon, 22 Apr 2019 10:10:50 +0530 Subject: [PATCH 36/41] fix: syntax error --- erpnext/utilities/activation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/utilities/activation.py b/erpnext/utilities/activation.py index ea1b0ea3a6a..e617cbaada0 100644 --- a/erpnext/utilities/activation.py +++ b/erpnext/utilities/activation.py @@ -10,7 +10,7 @@ def get_level(): activation_level = 0 sales_data = [] - doctypes = {"Item": 5, "Customer": 5, "Sales Order": 2, "Sales Invoice": 2, "Purchase Order": 2, "Employee": 3, "Lead": 3, "Quotation": 3 + doctypes = {"Item": 5, "Customer": 5, "Sales Order": 2, "Sales Invoice": 2, "Purchase Order": 2, "Employee": 3, "Lead": 3, "Quotation": 3, "Payment Entry": 2, "User": 5, "Student": 5, "Instructor": 5, "BOM": 3, "Journal Entry": 3, "Stock Entry": 3} for doctype, min_count in iteritems(doctypes): count = frappe.db.count(doctype) From afb59fa5c084b1e3238f8442779e9f1d0761aab0 Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Mon, 22 Apr 2019 10:47:37 +0530 Subject: [PATCH 37/41] fix: import iteritems --- erpnext/utilities/activation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/utilities/activation.py b/erpnext/utilities/activation.py index e617cbaada0..d6e7c9ea458 100644 --- a/erpnext/utilities/activation.py +++ b/erpnext/utilities/activation.py @@ -5,11 +5,13 @@ from __future__ import unicode_literals import frappe, erpnext from frappe import _ +from six import iteritems def get_level(): activation_level = 0 sales_data = [] + min_count = 0 doctypes = {"Item": 5, "Customer": 5, "Sales Order": 2, "Sales Invoice": 2, "Purchase Order": 2, "Employee": 3, "Lead": 3, "Quotation": 3, "Payment Entry": 2, "User": 5, "Student": 5, "Instructor": 5, "BOM": 3, "Journal Entry": 3, "Stock Entry": 3} for doctype, min_count in iteritems(doctypes): From 010a05df4831d2ffc0f8e9e7e4eb424a284219a2 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 22 Apr 2019 11:16:47 +0530 Subject: [PATCH 38/41] Update set_salary_details_submitable.py --- .../patches/v11_1/set_salary_details_submitable.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/erpnext/patches/v11_1/set_salary_details_submitable.py b/erpnext/patches/v11_1/set_salary_details_submitable.py index 36e78792ecb..f4477d9fd6d 100644 --- a/erpnext/patches/v11_1/set_salary_details_submitable.py +++ b/erpnext/patches/v11_1/set_salary_details_submitable.py @@ -1,12 +1,11 @@ from __future__ import unicode_literals import frappe -import itertools def execute(): - salary_structure = frappe.get_all("Salary Structure", filters={"docstatus": 1}, as_list=1) - salary_structure = list(itertools.chain(*salary_structure)) - salary_structure = "', '".join(map(str, salary_structure)) - - query = ''' update `tabSalary Detail` set docstatus=1 where parent in ('{0}')'''.format(salary_structure) - frappe.db.sql(query) + frappe.db.sql(""" + update `tabSalary Structure` ss, `tabSalary Detail` sd + set sd.docstatus=1 + where ss.name=sd.parent and ss.docstatus=1 and sd.parenttype='Salary Structure' + """) + From 7760db7563750cbffcee07496b1f6bd5266ab60d Mon Sep 17 00:00:00 2001 From: Anurag Mishra <32095923+Anurag810@users.noreply.github.com> Date: Mon, 22 Apr 2019 12:15:11 +0530 Subject: [PATCH 39/41] fix: sales order status for order type 'Maintenance' (#17119) * fix: Sales order Status for order type 'Maintenance' * fix: test case for sales order --- erpnext/controllers/status_updater.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/status_updater.py b/erpnext/controllers/status_updater.py index d94564e4b5c..d86c3f546c3 100644 --- a/erpnext/controllers/status_updater.py +++ b/erpnext/controllers/status_updater.py @@ -34,8 +34,8 @@ status_map = { ], "Sales Order": [ ["Draft", None], - ["To Deliver and Bill", "eval:self.per_delivered < 100 and self.per_billed < 100 and self.docstatus == 1"], - ["To Bill", "eval:self.per_delivered == 100 and self.per_billed < 100 and self.docstatus == 1"], + ["To Deliver and Bill", "eval:self.per_delivered < 100 and self.per_billed < 100 and self.docstatus == 1 and self.order_type in ['Sales', 'Shopping Cart']"], + ["To Bill", "eval:self.per_delivered == 100 or self.order_type == 'Maintenance' and self.per_billed < 100 and self.docstatus == 1"], ["To Deliver", "eval:self.per_delivered < 100 and self.per_billed == 100 and self.docstatus == 1"], ["Completed", "eval:self.per_delivered == 100 and self.per_billed == 100 and self.docstatus == 1"], ["Completed", "eval:self.order_type == 'Maintenance' and self.per_billed == 100 and self.docstatus == 1"], From d1332f6c2472b376f981f13cc32eca996bf74fb9 Mon Sep 17 00:00:00 2001 From: Saif Ur Rehman Date: Mon, 22 Apr 2019 12:17:25 +0500 Subject: [PATCH 40/41] fix: Set Allocate Advance Automatically disabled by default --- .../doctype/purchase_invoice/purchase_invoice.json | 8 +++++--- erpnext/accounts/doctype/sales_invoice/sales_invoice.json | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index d798fd5fdc6..885f2c8926c 100755 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -3511,6 +3511,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "clearance_date", "fieldtype": "Date", "hidden": 1, @@ -3543,6 +3544,7 @@ "bold": 0, "collapsible": 0, "columns": 0, + "fetch_if_empty": 0, "fieldname": "col_br_payments", "fieldtype": "Column Break", "hidden": 0, @@ -3880,7 +3882,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "1", + "default": "", "fetch_if_empty": 0, "fieldname": "allocate_advances_automatically", "fieldtype": "Check", @@ -4901,7 +4903,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2019-04-11 16:08:22.288425", + "modified": "2019-04-22 12:45:49.728359", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", @@ -5016,4 +5018,4 @@ "track_changes": 1, "track_seen": 0, "track_views": 0 -} \ 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 7f7e6f981a9..12ae9aae7b0 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -3630,7 +3630,7 @@ "bold": 0, "collapsible": 0, "columns": 0, - "default": "1", + "default": "", "fetch_if_empty": 0, "fieldname": "allocate_advances_automatically", "fieldtype": "Check", @@ -5816,7 +5816,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2019-04-10 16:10:34.266458", + "modified": "2019-04-22 12:45:41.109345", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", From 32207ad722766b41e4bdc64922dfb254db33f064 Mon Sep 17 00:00:00 2001 From: Sahil Khan Date: Mon, 22 Apr 2019 14:25:43 +0550 Subject: [PATCH 41/41] bumped to version 11.1.22 --- erpnext/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/__init__.py b/erpnext/__init__.py index 608e6b75b6d..1c187fa01c4 100644 --- a/erpnext/__init__.py +++ b/erpnext/__init__.py @@ -5,7 +5,7 @@ import frappe from erpnext.hooks import regional_overrides from frappe.utils import getdate -__version__ = '11.1.21' +__version__ = '11.1.22' def get_default_company(user=None): '''Get default company for user'''