From 450b3f338e73c0a8735ae0a5b228775426d2bed8 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:21:48 +0530 Subject: [PATCH 01/18] fix: set up filters for dimensions (cherry picked from commit 2fd8de2f76212921aae604a8bdd21e6ae9c120fb) # Conflicts: # erpnext/assets/doctype/asset_capitalization/asset_capitalization.js --- .../asset_capitalization.js | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js index 6ac6289c837..ac369ac4895 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js @@ -11,6 +11,7 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s onload() { this.setup_queries(); + erpnext.accounts.dimensions.setup_dimension_filters(this.frm, this.frm.doctype); } refresh() { @@ -63,6 +64,29 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s }; }); +<<<<<<< HEAD +======= + me.frm.set_query("serial_and_batch_bundle", "stock_items", (doc, cdt, cdn) => { + let row = locals[cdt][cdn]; + return { + filters: { + item_code: row.item_code, + voucher_type: doc.doctype, + voucher_no: ["in", [doc.name, ""]], + is_cancelled: 0, + }, + }; + }); + + me.frm.set_query("cost_canter", function () { + return { + filters: { + company: me.frm.doc.company, + } + }; + }); + +>>>>>>> 2fd8de2f76 (fix: set up filters for dimensions) me.frm.set_query("item_code", "stock_items", function () { return erpnext.queries.item({ is_stock_item: 1 }); }); From db319f95f1ea8b3920800b7e0a48440bda8c6c08 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:26:47 +0530 Subject: [PATCH 02/18] fix: removed extra filter condition (cherry picked from commit 6fa29376a0b95029aa35ec10fd4cce915c8c6832) --- .../doctype/asset_capitalization/asset_capitalization.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js index ac369ac4895..a99b6405f7c 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js @@ -78,13 +78,6 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s }; }); - me.frm.set_query("cost_canter", function () { - return { - filters: { - company: me.frm.doc.company, - } - }; - }); >>>>>>> 2fd8de2f76 (fix: set up filters for dimensions) me.frm.set_query("item_code", "stock_items", function () { From 47a9325177325b12e893f4c67156752a4a814b41 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Wed, 14 Aug 2024 14:31:56 +0530 Subject: [PATCH 03/18] chore: linters check (cherry picked from commit 0d427933974c67a966edb4ba4aba0a422c49088a) # Conflicts: # erpnext/assets/doctype/asset_capitalization/asset_capitalization.js --- .../doctype/asset_capitalization/asset_capitalization.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js index a99b6405f7c..e8f641f434d 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js @@ -78,8 +78,11 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s }; }); +<<<<<<< HEAD >>>>>>> 2fd8de2f76 (fix: set up filters for dimensions) +======= +>>>>>>> 0d42793397 (chore: linters check) me.frm.set_query("item_code", "stock_items", function () { return erpnext.queries.item({ is_stock_item: 1 }); }); From ea7c82c6a3cb5e03cd54240350365520b6569df9 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Thu, 15 Aug 2024 13:12:38 +0530 Subject: [PATCH 04/18] chore: resolved conflicts --- .../asset_capitalization.js | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js index e8f641f434d..6f73dfc6736 100644 --- a/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js +++ b/erpnext/assets/doctype/asset_capitalization/asset_capitalization.js @@ -64,25 +64,6 @@ erpnext.assets.AssetCapitalization = class AssetCapitalization extends erpnext.s }; }); -<<<<<<< HEAD -======= - me.frm.set_query("serial_and_batch_bundle", "stock_items", (doc, cdt, cdn) => { - let row = locals[cdt][cdn]; - return { - filters: { - item_code: row.item_code, - voucher_type: doc.doctype, - voucher_no: ["in", [doc.name, ""]], - is_cancelled: 0, - }, - }; - }); - -<<<<<<< HEAD - ->>>>>>> 2fd8de2f76 (fix: set up filters for dimensions) -======= ->>>>>>> 0d42793397 (chore: linters check) me.frm.set_query("item_code", "stock_items", function () { return erpnext.queries.item({ is_stock_item: 1 }); }); From b3c9697b7c534c84e2e17896e464fc2b8b636d27 Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Mon, 1 Jul 2024 13:08:51 +0530 Subject: [PATCH 05/18] fix: resolve gl entries duplication in asset purchase workflow (#41845) * fix: resolve gl entries duplication in asset purchase workflow * fix: prevent duplicate entry when creating purchase receipt from purchase invoice * chore: test case added * fix: fixed missing asset category issue (cherry picked from commit 55a4bd469b17f8c8abe5e77d7c7f5413cc09c5bc) # Conflicts: # erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py --- .../purchase_invoice/purchase_invoice.py | 15 ++ .../purchase_invoice/test_purchase_invoice.py | 176 +++++++++++++++++- .../purchase_receipt/purchase_receipt.py | 2 +- 3 files changed, 191 insertions(+), 2 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 698744b6151..e9e4ffea804 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -369,6 +369,21 @@ class PurchaseInvoice(BuyingController): item.expense_account = stock_not_billed_account elif item.is_fixed_asset: account = None + if not item.pr_detail and item.po_detail: + receipt_item = frappe.get_cached_value( + "Purchase Receipt Item", + { + "purchase_order": item.purchase_order, + "purchase_order_item": item.po_detail, + "docstatus": 1, + }, + ["name", "parent"], + as_dict=1, + ) + if receipt_item: + item.pr_detail = receipt_item.name + item.purchase_receipt = receipt_item.parent + if item.pr_detail: if not self.asset_received_but_not_billed: self.asset_received_but_not_billed = self.get_company_default( diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index f1f7f54a135..b4e5fcabc1b 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -10,7 +10,11 @@ import erpnext from erpnext.accounts.doctype.account.test_account import create_account, get_inventory_account from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_entry from erpnext.buying.doctype.purchase_order.purchase_order import get_mapped_purchase_invoice -from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order +from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice as make_pi_from_po +from erpnext.buying.doctype.purchase_order.test_purchase_order import ( + create_pr_against_po, + create_purchase_order, +) from erpnext.buying.doctype.supplier.test_supplier import create_supplier from erpnext.controllers.accounts_controller import get_payment_terms from erpnext.controllers.buying_controller import QtyMismatchError @@ -1957,6 +1961,176 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin): self.assertRaises(frappe.ValidationError, dr_note.save) +<<<<<<< HEAD +======= + def test_debit_note_without_item(self): + pi = make_purchase_invoice(item_name="_Test Item", qty=10, do_not_submit=True) + pi.items[0].item_code = "" + pi.save() + + self.assertFalse(pi.items[0].item_code) + pi.submit() + + return_pi = make_purchase_invoice( + item_name="_Test Item", + is_return=1, + return_against=pi.name, + qty=-10, + do_not_save=True, + ) + return_pi.items[0].item_code = "" + return_pi.save() + return_pi.submit() + self.assertEqual(return_pi.docstatus, 1) + + def test_purchase_invoice_with_use_serial_batch_field_for_rejected_qty(self): + from erpnext.stock.doctype.item.test_item import make_item + from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse + + batch_item = make_item( + "_Test Purchase Invoice Batch Item For Rejected Qty", + properties={"has_batch_no": 1, "create_new_batch": 1, "is_stock_item": 1}, + ).name + + serial_item = make_item( + "_Test Purchase Invoice Serial Item for Rejected Qty", + properties={"has_serial_no": 1, "is_stock_item": 1}, + ).name + + rej_warehouse = create_warehouse("_Test Purchase INV Warehouse For Rejected Qty") + + batch_no = "BATCH-PI-BNU-TPRBI-0001" + serial_nos = ["SNU-PI-TPRSI-0001", "SNU-PI-TPRSI-0002", "SNU-PI-TPRSI-0003"] + + if not frappe.db.exists("Batch", batch_no): + frappe.get_doc( + { + "doctype": "Batch", + "batch_id": batch_no, + "item": batch_item, + } + ).insert() + + for serial_no in serial_nos: + if not frappe.db.exists("Serial No", serial_no): + frappe.get_doc( + { + "doctype": "Serial No", + "item_code": serial_item, + "serial_no": serial_no, + } + ).insert() + + pi = make_purchase_invoice( + item_code=batch_item, + received_qty=10, + qty=8, + rejected_qty=2, + update_stock=1, + rejected_warehouse=rej_warehouse, + use_serial_batch_fields=1, + batch_no=batch_no, + rate=100, + do_not_submit=1, + ) + + pi.append( + "items", + { + "item_code": serial_item, + "qty": 2, + "rate": 100, + "base_rate": 100, + "item_name": serial_item, + "uom": "Nos", + "stock_uom": "Nos", + "conversion_factor": 1, + "rejected_qty": 1, + "warehouse": pi.items[0].warehouse, + "rejected_warehouse": rej_warehouse, + "use_serial_batch_fields": 1, + "serial_no": "\n".join(serial_nos[:2]), + "rejected_serial_no": serial_nos[2], + }, + ) + + pi.save() + pi.submit() + + pi.reload() + + for row in pi.items: + self.assertTrue(row.serial_and_batch_bundle) + self.assertTrue(row.rejected_serial_and_batch_bundle) + + if row.item_code == batch_item: + self.assertEqual(row.batch_no, batch_no) + else: + self.assertEqual(row.serial_no, "\n".join(serial_nos[:2])) + self.assertEqual(row.rejected_serial_no, serial_nos[2]) + + def test_make_pr_and_pi_from_po(self): + from erpnext.assets.doctype.asset.test_asset import create_asset_category + + if not frappe.db.exists("Asset Category", "Computers"): + create_asset_category() + + item = create_item( + item_code="_Test_Item", is_stock_item=0, is_fixed_asset=1, asset_category="Computers" + ) + po = create_purchase_order(item_code=item.item_code) + pr = create_pr_against_po(po.name, 10) + pi = make_pi_from_po(po.name) + pi.insert() + pi.submit() + + pr_gl_entries = frappe.db.sql( + """select account, debit, credit + from `tabGL Entry` where voucher_type='Purchase Receipt' and voucher_no=%s + order by account asc""", + pr.name, + as_dict=1, + ) + + pr_expected_values = [ + ["Asset Received But Not Billed - _TC", 0, 5000], + ["CWIP Account - _TC", 5000, 0], + ] + + for i, gle in enumerate(pr_gl_entries): + self.assertEqual(pr_expected_values[i][0], gle.account) + self.assertEqual(pr_expected_values[i][1], gle.debit) + self.assertEqual(pr_expected_values[i][2], gle.credit) + + pi_gl_entries = frappe.db.sql( + """select account, debit, credit + from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s + order by account asc""", + pi.name, + as_dict=1, + ) + pi_expected_values = [ + ["Asset Received But Not Billed - _TC", 5000, 0], + ["Creditors - _TC", 0, 5000], + ] + + for i, gle in enumerate(pi_gl_entries): + self.assertEqual(pi_expected_values[i][0], gle.account) + self.assertEqual(pi_expected_values[i][1], gle.debit) + self.assertEqual(pi_expected_values[i][2], gle.credit) + + +def set_advance_flag(company, flag, default_account): + frappe.db.set_value( + "Company", + company, + { + "book_advance_payments_in_separate_party_account": flag, + "default_advance_paid_account": default_account, + }, + ) + +>>>>>>> 55a4bd469b (fix: resolve gl entries duplication in asset purchase workflow (#41845)) def check_gl_entries( doc, diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py index 1909874601d..8ed59f452e2 100644 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py @@ -546,7 +546,7 @@ class PurchaseReceipt(BuyingController): if not ( (erpnext.is_perpetual_inventory_enabled(self.company) and d.item_code in stock_items) - or d.is_fixed_asset + or (d.is_fixed_asset and not d.purchase_invoice) ): continue From 91bff147e038ac21bf6b5fdcc0c9040d34f7f84c Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Wed, 28 Aug 2024 12:05:25 +0530 Subject: [PATCH 06/18] chore: resolved conflicts --- .../purchase_invoice/test_purchase_invoice.py | 170 ------------------ 1 file changed, 170 deletions(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index b4e5fcabc1b..23c371c7fe3 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1961,176 +1961,6 @@ class TestPurchaseInvoice(FrappeTestCase, StockTestMixin): self.assertRaises(frappe.ValidationError, dr_note.save) -<<<<<<< HEAD -======= - def test_debit_note_without_item(self): - pi = make_purchase_invoice(item_name="_Test Item", qty=10, do_not_submit=True) - pi.items[0].item_code = "" - pi.save() - - self.assertFalse(pi.items[0].item_code) - pi.submit() - - return_pi = make_purchase_invoice( - item_name="_Test Item", - is_return=1, - return_against=pi.name, - qty=-10, - do_not_save=True, - ) - return_pi.items[0].item_code = "" - return_pi.save() - return_pi.submit() - self.assertEqual(return_pi.docstatus, 1) - - def test_purchase_invoice_with_use_serial_batch_field_for_rejected_qty(self): - from erpnext.stock.doctype.item.test_item import make_item - from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse - - batch_item = make_item( - "_Test Purchase Invoice Batch Item For Rejected Qty", - properties={"has_batch_no": 1, "create_new_batch": 1, "is_stock_item": 1}, - ).name - - serial_item = make_item( - "_Test Purchase Invoice Serial Item for Rejected Qty", - properties={"has_serial_no": 1, "is_stock_item": 1}, - ).name - - rej_warehouse = create_warehouse("_Test Purchase INV Warehouse For Rejected Qty") - - batch_no = "BATCH-PI-BNU-TPRBI-0001" - serial_nos = ["SNU-PI-TPRSI-0001", "SNU-PI-TPRSI-0002", "SNU-PI-TPRSI-0003"] - - if not frappe.db.exists("Batch", batch_no): - frappe.get_doc( - { - "doctype": "Batch", - "batch_id": batch_no, - "item": batch_item, - } - ).insert() - - for serial_no in serial_nos: - if not frappe.db.exists("Serial No", serial_no): - frappe.get_doc( - { - "doctype": "Serial No", - "item_code": serial_item, - "serial_no": serial_no, - } - ).insert() - - pi = make_purchase_invoice( - item_code=batch_item, - received_qty=10, - qty=8, - rejected_qty=2, - update_stock=1, - rejected_warehouse=rej_warehouse, - use_serial_batch_fields=1, - batch_no=batch_no, - rate=100, - do_not_submit=1, - ) - - pi.append( - "items", - { - "item_code": serial_item, - "qty": 2, - "rate": 100, - "base_rate": 100, - "item_name": serial_item, - "uom": "Nos", - "stock_uom": "Nos", - "conversion_factor": 1, - "rejected_qty": 1, - "warehouse": pi.items[0].warehouse, - "rejected_warehouse": rej_warehouse, - "use_serial_batch_fields": 1, - "serial_no": "\n".join(serial_nos[:2]), - "rejected_serial_no": serial_nos[2], - }, - ) - - pi.save() - pi.submit() - - pi.reload() - - for row in pi.items: - self.assertTrue(row.serial_and_batch_bundle) - self.assertTrue(row.rejected_serial_and_batch_bundle) - - if row.item_code == batch_item: - self.assertEqual(row.batch_no, batch_no) - else: - self.assertEqual(row.serial_no, "\n".join(serial_nos[:2])) - self.assertEqual(row.rejected_serial_no, serial_nos[2]) - - def test_make_pr_and_pi_from_po(self): - from erpnext.assets.doctype.asset.test_asset import create_asset_category - - if not frappe.db.exists("Asset Category", "Computers"): - create_asset_category() - - item = create_item( - item_code="_Test_Item", is_stock_item=0, is_fixed_asset=1, asset_category="Computers" - ) - po = create_purchase_order(item_code=item.item_code) - pr = create_pr_against_po(po.name, 10) - pi = make_pi_from_po(po.name) - pi.insert() - pi.submit() - - pr_gl_entries = frappe.db.sql( - """select account, debit, credit - from `tabGL Entry` where voucher_type='Purchase Receipt' and voucher_no=%s - order by account asc""", - pr.name, - as_dict=1, - ) - - pr_expected_values = [ - ["Asset Received But Not Billed - _TC", 0, 5000], - ["CWIP Account - _TC", 5000, 0], - ] - - for i, gle in enumerate(pr_gl_entries): - self.assertEqual(pr_expected_values[i][0], gle.account) - self.assertEqual(pr_expected_values[i][1], gle.debit) - self.assertEqual(pr_expected_values[i][2], gle.credit) - - pi_gl_entries = frappe.db.sql( - """select account, debit, credit - from `tabGL Entry` where voucher_type='Purchase Invoice' and voucher_no=%s - order by account asc""", - pi.name, - as_dict=1, - ) - pi_expected_values = [ - ["Asset Received But Not Billed - _TC", 5000, 0], - ["Creditors - _TC", 0, 5000], - ] - - for i, gle in enumerate(pi_gl_entries): - self.assertEqual(pi_expected_values[i][0], gle.account) - self.assertEqual(pi_expected_values[i][1], gle.debit) - self.assertEqual(pi_expected_values[i][2], gle.credit) - - -def set_advance_flag(company, flag, default_account): - frappe.db.set_value( - "Company", - company, - { - "book_advance_payments_in_separate_party_account": flag, - "default_advance_paid_account": default_account, - }, - ) - ->>>>>>> 55a4bd469b (fix: resolve gl entries duplication in asset purchase workflow (#41845)) def check_gl_entries( doc, From dda4002da4b5779401b0f5f15f9956cee8d91e72 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 28 Aug 2024 12:21:22 +0530 Subject: [PATCH 07/18] fix: typeerror on Payment Entry (cherry picked from commit e9cf8937cd4a6c00666bf5f016b0647121d9838c) # Conflicts: # erpnext/accounts/doctype/payment_entry/payment_entry.js --- erpnext/accounts/doctype/payment_entry/payment_entry.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 137dedf80ec..8cd3d20e858 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -249,8 +249,15 @@ frappe.ui.form.on('Payment Entry', { frm.refresh_fields(); }, +<<<<<<< HEAD set_dynamic_labels: function(frm) { var company_currency = frm.doc.company? frappe.get_doc(":Company", frm.doc.company).default_currency: ""; +======= + set_dynamic_labels: function (frm) { + var company_currency = frm.doc.company + ? frappe.get_doc(":Company", frm.doc.company)?.default_currency + : ""; +>>>>>>> e9cf8937cd (fix: typeerror on Payment Entry) frm.set_currency_labels(["base_paid_amount", "base_received_amount", "base_total_allocated_amount", "difference_amount", "base_paid_amount_after_tax", "base_received_amount_after_tax", From 6cb9ae20358d1caf13b3cf647df41085470f2d76 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Wed, 28 Aug 2024 13:23:00 +0530 Subject: [PATCH 08/18] chore: resolve conflict --- erpnext/accounts/doctype/payment_entry/payment_entry.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 8cd3d20e858..2e5a278c492 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -249,15 +249,8 @@ frappe.ui.form.on('Payment Entry', { frm.refresh_fields(); }, -<<<<<<< HEAD set_dynamic_labels: function(frm) { - var company_currency = frm.doc.company? frappe.get_doc(":Company", frm.doc.company).default_currency: ""; -======= - set_dynamic_labels: function (frm) { - var company_currency = frm.doc.company - ? frappe.get_doc(":Company", frm.doc.company)?.default_currency - : ""; ->>>>>>> e9cf8937cd (fix: typeerror on Payment Entry) + var company_currency = frm.doc.company? frappe.get_doc(":Company", frm.doc.company)?.default_currency: ""; frm.set_currency_labels(["base_paid_amount", "base_received_amount", "base_total_allocated_amount", "difference_amount", "base_paid_amount_after_tax", "base_received_amount_after_tax", From 9db7f7b033c5045ab54f0158e45e956aab945655 Mon Sep 17 00:00:00 2001 From: Nicolas Pereira <41456803+hqnicolas@users.noreply.github.com> Date: Wed, 28 Aug 2024 05:48:55 -0300 Subject: [PATCH 09/18] fix: default fiscal year in report v14 (#42960) * loads the fiscal year from the calendar year * loads the fiscal year from the calendar year * loads the fiscal year from the calendar year * loads the fiscal year from the calendar year * fix: default fiscal year in report v14 * fix: default fiscal year in report v14 --prettier --------- Co-authored-by: Nihantra C. Patel <141945075+Nihantra-Patel@users.noreply.github.com> --- .../report/budget_variance_report/budget_variance_report.js | 4 ++-- .../sales_partner_target_variance_based_on_item_group.js | 2 +- .../sales_person_target_variance_based_on_item_group.js | 2 +- .../territory_target_variance_based_on_item_group.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js index 156ae8f2f2a..83bd48c71f3 100644 --- a/erpnext/accounts/report/budget_variance_report/budget_variance_report.js +++ b/erpnext/accounts/report/budget_variance_report/budget_variance_report.js @@ -43,7 +43,7 @@ function get_filters() { label: __("From Fiscal Year"), fieldtype: "Link", options: "Fiscal Year", - default: frappe.sys_defaults.fiscal_year, + default: erpnext.utils.get_fiscal_year(frappe.datetime.get_today()), reqd: 1, }, { @@ -51,7 +51,7 @@ function get_filters() { label: __("To Fiscal Year"), fieldtype: "Link", options: "Fiscal Year", - default: frappe.sys_defaults.fiscal_year, + default: erpnext.utils.get_fiscal_year(frappe.datetime.get_today()), reqd: 1, }, { diff --git a/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/sales_partner_target_variance_based_on_item_group.js b/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/sales_partner_target_variance_based_on_item_group.js index f8c950763e1..6740083c8d4 100644 --- a/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/sales_partner_target_variance_based_on_item_group.js +++ b/erpnext/selling/report/sales_partner_target_variance_based_on_item_group/sales_partner_target_variance_based_on_item_group.js @@ -16,7 +16,7 @@ frappe.query_reports["Sales Partner Target Variance based on Item Group"] = { label: __("Fiscal Year"), fieldtype: "Link", options: "Fiscal Year", - default: frappe.sys_defaults.fiscal_year, + default: erpnext.utils.get_fiscal_year(frappe.datetime.get_today()), }, { fieldname: "doctype", diff --git a/erpnext/selling/report/sales_person_target_variance_based_on_item_group/sales_person_target_variance_based_on_item_group.js b/erpnext/selling/report/sales_person_target_variance_based_on_item_group/sales_person_target_variance_based_on_item_group.js index b3497085fb7..4d38f490333 100644 --- a/erpnext/selling/report/sales_person_target_variance_based_on_item_group/sales_person_target_variance_based_on_item_group.js +++ b/erpnext/selling/report/sales_person_target_variance_based_on_item_group/sales_person_target_variance_based_on_item_group.js @@ -16,7 +16,7 @@ frappe.query_reports["Sales Person Target Variance Based On Item Group"] = { label: __("Fiscal Year"), fieldtype: "Link", options: "Fiscal Year", - default: frappe.sys_defaults.fiscal_year, + default: erpnext.utils.get_fiscal_year(frappe.datetime.get_today()), }, { fieldname: "doctype", diff --git a/erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js b/erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js index 988fb86ff6c..bebe1ab16e5 100644 --- a/erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js +++ b/erpnext/selling/report/territory_target_variance_based_on_item_group/territory_target_variance_based_on_item_group.js @@ -16,7 +16,7 @@ frappe.query_reports["Territory Target Variance Based On Item Group"] = { label: __("Fiscal Year"), fieldtype: "Link", options: "Fiscal Year", - default: frappe.sys_defaults.fiscal_year, + default: erpnext.utils.get_fiscal_year(frappe.datetime.get_today()), }, { fieldname: "doctype", From 6fda0e8e1b678b93dc408cba7117270a62a0cb9c Mon Sep 17 00:00:00 2001 From: Khushi Rawat <142375893+khushi8112@users.noreply.github.com> Date: Wed, 28 Aug 2024 15:22:07 +0530 Subject: [PATCH 10/18] chore: linters check --- .../accounts/doctype/purchase_invoice/test_purchase_invoice.py | 1 - 1 file changed, 1 deletion(-) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 23c371c7fe3..950a7a3eb29 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -12,7 +12,6 @@ from erpnext.accounts.doctype.payment_entry.payment_entry import get_payment_ent from erpnext.buying.doctype.purchase_order.purchase_order import get_mapped_purchase_invoice from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice as make_pi_from_po from erpnext.buying.doctype.purchase_order.test_purchase_order import ( - create_pr_against_po, create_purchase_order, ) from erpnext.buying.doctype.supplier.test_supplier import create_supplier From 9afbd43f05d71b921c35cfee7f9a90bead244368 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 29 Aug 2024 11:46:29 +0530 Subject: [PATCH 11/18] refactor: better UX on Bank Clearance tool (cherry picked from commit 6a06e26d04b6fa50eab4068c9e26349560eb0fcb) # Conflicts: # erpnext/accounts/doctype/bank_clearance/bank_clearance.js --- .../doctype/bank_clearance/bank_clearance.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/erpnext/accounts/doctype/bank_clearance/bank_clearance.js b/erpnext/accounts/doctype/bank_clearance/bank_clearance.js index ddf7bc5dec6..4ff718c90c2 100644 --- a/erpnext/accounts/doctype/bank_clearance/bank_clearance.js +++ b/erpnext/accounts/doctype/bank_clearance/bank_clearance.js @@ -37,7 +37,16 @@ frappe.ui.form.on("Bank Clearance", { frm.disable_save(); frm.add_custom_button(__("Get Payment Entries"), () => frm.trigger("get_payment_entries")); +<<<<<<< HEAD frm.change_custom_button_type("Get Payment Entries", null, "primary"); +======= + frm.change_custom_button_type(__("Get Payment Entries"), null, "primary"); + if (frm.doc.payment_entries.length) { + frm.add_custom_button(__("Update Clearance Date"), () => frm.trigger("update_clearance_date")); + frm.change_custom_button_type(__("Get Payment Entries"), null, "default"); + frm.change_custom_button_type(__("Update Clearance Date"), null, "primary"); + } +>>>>>>> 6a06e26d04 (refactor: better UX on Bank Clearance tool) }, update_clearance_date: function (frm) { @@ -45,6 +54,7 @@ frappe.ui.form.on("Bank Clearance", { method: "update_clearance_date", doc: frm.doc, callback: function (r, rt) { +<<<<<<< HEAD frm.refresh_field("payment_entries"); frm.refresh_fields(); @@ -52,6 +62,9 @@ frappe.ui.form.on("Bank Clearance", { frm.change_custom_button_type("Get Payment Entries", null, "primary"); frm.change_custom_button_type("Update Clearance Date", null, "default"); } +======= + frm.refresh(); +>>>>>>> 6a06e26d04 (refactor: better UX on Bank Clearance tool) }, }); }, @@ -60,6 +73,7 @@ frappe.ui.form.on("Bank Clearance", { return frappe.call({ method: "get_payment_entries", doc: frm.doc, +<<<<<<< HEAD callback: function (r, rt) { frm.refresh_field("payment_entries"); @@ -71,6 +85,10 @@ frappe.ui.form.on("Bank Clearance", { frm.change_custom_button_type("Get Payment Entries", null, "default"); frm.change_custom_button_type("Update Clearance Date", null, "primary"); } +======= + callback: function () { + frm.refresh(); +>>>>>>> 6a06e26d04 (refactor: better UX on Bank Clearance tool) }, }); }, From cfb5a6592c1ac55e120c737a18a913679d681243 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 29 Aug 2024 14:09:42 +0530 Subject: [PATCH 12/18] chore: resolve conflict --- .../doctype/bank_clearance/bank_clearance.js | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/erpnext/accounts/doctype/bank_clearance/bank_clearance.js b/erpnext/accounts/doctype/bank_clearance/bank_clearance.js index 4ff718c90c2..b614bff1ed1 100644 --- a/erpnext/accounts/doctype/bank_clearance/bank_clearance.js +++ b/erpnext/accounts/doctype/bank_clearance/bank_clearance.js @@ -36,17 +36,12 @@ frappe.ui.form.on("Bank Clearance", { refresh: function (frm) { frm.disable_save(); frm.add_custom_button(__("Get Payment Entries"), () => frm.trigger("get_payment_entries")); - -<<<<<<< HEAD - frm.change_custom_button_type("Get Payment Entries", null, "primary"); -======= frm.change_custom_button_type(__("Get Payment Entries"), null, "primary"); if (frm.doc.payment_entries.length) { frm.add_custom_button(__("Update Clearance Date"), () => frm.trigger("update_clearance_date")); frm.change_custom_button_type(__("Get Payment Entries"), null, "default"); frm.change_custom_button_type(__("Update Clearance Date"), null, "primary"); } ->>>>>>> 6a06e26d04 (refactor: better UX on Bank Clearance tool) }, update_clearance_date: function (frm) { @@ -54,17 +49,7 @@ frappe.ui.form.on("Bank Clearance", { method: "update_clearance_date", doc: frm.doc, callback: function (r, rt) { -<<<<<<< HEAD - frm.refresh_field("payment_entries"); - frm.refresh_fields(); - - if (!frm.doc.payment_entries.length) { - frm.change_custom_button_type("Get Payment Entries", null, "primary"); - frm.change_custom_button_type("Update Clearance Date", null, "default"); - } -======= frm.refresh(); ->>>>>>> 6a06e26d04 (refactor: better UX on Bank Clearance tool) }, }); }, @@ -73,22 +58,8 @@ frappe.ui.form.on("Bank Clearance", { return frappe.call({ method: "get_payment_entries", doc: frm.doc, -<<<<<<< HEAD - callback: function (r, rt) { - frm.refresh_field("payment_entries"); - - if (frm.doc.payment_entries.length) { - frm.add_custom_button(__("Update Clearance Date"), () => - frm.trigger("update_clearance_date") - ); - - frm.change_custom_button_type("Get Payment Entries", null, "default"); - frm.change_custom_button_type("Update Clearance Date", null, "primary"); - } -======= callback: function () { frm.refresh(); ->>>>>>> 6a06e26d04 (refactor: better UX on Bank Clearance tool) }, }); }, From ef7a83c35480527e44bf3ea739db6b976e657e62 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Thu, 29 Aug 2024 15:54:55 +0530 Subject: [PATCH 13/18] refactor: link utility report with bank reconciliation statement (cherry picked from commit 00eac65712bc8dfdaf53589c8a4f5abc3d28a9c3) --- .../bank_reconciliation_statement.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js index efcfa7a5ee5..9335a8cd65a 100644 --- a/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js +++ b/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.js @@ -46,4 +46,20 @@ frappe.query_reports["Bank Reconciliation Statement"] = { fieldtype: "Check", }, ], + formatter: function (value, row, column, data, default_formatter, filter) { + if (column.fieldname == "payment_entry" && value == "Cheques and Deposits incorrectly cleared") { + column.link_onclick = + "frappe.query_reports['Bank Reconciliation Statement'].open_utility_report()"; + } + return default_formatter(value, row, column, data); + }, + open_utility_report: function () { + frappe.route_options = { + company: frappe.query_report.get_filter_value("company"), + account: frappe.query_report.get_filter_value("account"), + report_date: frappe.query_report.get_filter_value("report_date"), + }; + frappe.open_in_new_tab = true; + frappe.set_route("query-report", "Cheques and Deposits Incorrectly cleared"); + }, }; From c55f8e3388944cf734105796fe50bd4e4974c0eb Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 11:12:22 +0530 Subject: [PATCH 14/18] fix: Discount and taxes in return document should follow the reference document (backport #41911) (#42573) * fix: Discount and taxes in return document should follow the reference document (#41911) * fix: Discount and taxes in return document should follow the reference document * fix: Ignore Pricing rule on debit/credit note if created against PI/SI with test cases * fix: linter issue (cherry picked from commit 281198456dde21d521b653d660e10ec045279070) # Conflicts: # erpnext/controllers/sales_and_purchase_return.py * fix: resolved conflict --------- Co-authored-by: Nabin Hait --- .../doctype/pricing_rule/test_pricing_rule.py | 65 +++++++++++++++++++ erpnext/controllers/accounts_controller.py | 7 +- .../controllers/sales_and_purchase_return.py | 3 + erpnext/controllers/taxes_and_totals.py | 4 +- erpnext/public/js/controllers/transaction.js | 2 + 5 files changed, 77 insertions(+), 4 deletions(-) diff --git a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py index 46c874b533c..9274871b492 100644 --- a/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py +++ b/erpnext/accounts/doctype/pricing_rule/test_pricing_rule.py @@ -6,7 +6,9 @@ import unittest import frappe +from erpnext.accounts.doctype.purchase_invoice.test_purchase_invoice import make_purchase_invoice from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice +from erpnext.controllers.sales_and_purchase_return import make_return_doc from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order from erpnext.stock.doctype.item.test_item import make_item from erpnext.stock.get_item_details import get_item_details @@ -1099,6 +1101,69 @@ class TestPricingRule(unittest.TestCase): pricing_rule.is_recursive = True self.assertRaises(frappe.ValidationError, pricing_rule.save) + def test_ignore_pricing_rule_for_credit_note(self): + frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule") + pricing_rule = make_pricing_rule( + discount_percentage=20, + selling=1, + buying=1, + priority=1, + title="_Test Pricing Rule", + ) + + si = create_sales_invoice(do_not_submit=True, customer="_Test Customer 1", qty=1) + item = si.items[0] + si.submit() + self.assertEqual(item.discount_percentage, 20) + self.assertEqual(item.rate, 80) + + # change discount on pricing rule + pricing_rule.discount_percentage = 30 + pricing_rule.save() + + credit_note = make_return_doc(si.doctype, si.name) + credit_note.save() + self.assertEqual(credit_note.ignore_pricing_rule, 1) + self.assertEqual(credit_note.pricing_rules, []) + self.assertEqual(credit_note.items[0].discount_percentage, 20) + self.assertEqual(credit_note.items[0].rate, 80) + self.assertEqual(credit_note.items[0].pricing_rules, None) + + credit_note.delete() + si.cancel() + + def test_ignore_pricing_rule_for_debit_note(self): + frappe.delete_doc_if_exists("Pricing Rule", "_Test Pricing Rule") + pricing_rule = make_pricing_rule( + discount_percentage=20, + buying=1, + priority=1, + title="_Test Pricing Rule", + ) + + pi = make_purchase_invoice(do_not_submit=True, supplier="_Test Supplier 1", qty=1) + item = pi.items[0] + pi.submit() + self.assertEqual(item.discount_percentage, 20) + self.assertEqual(item.rate, 40) + + # change discount on pricing rule + pricing_rule.discount_percentage = 30 + pricing_rule.save() + + # create debit note from purchase invoice + debit_note = make_return_doc(pi.doctype, pi.name) + debit_note.save() + + self.assertEqual(debit_note.ignore_pricing_rule, 1) + self.assertEqual(debit_note.pricing_rules, []) + self.assertEqual(debit_note.items[0].discount_percentage, 20) + self.assertEqual(debit_note.items[0].rate, 40) + self.assertEqual(debit_note.items[0].pricing_rules, None) + + debit_note.delete() + pi.cancel() + test_dependencies = ["Campaign"] diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index cd95a2d46da..b8218ce8ddc 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -84,7 +84,6 @@ force_item_fields = ( "brand", "stock_uom", "is_fixed_asset", - "item_tax_rate", "pricing_rules", "weight_per_unit", "weight_uom", @@ -707,7 +706,6 @@ class AccountsController(TransactionBase): args["is_subcontracted"] = self.is_subcontracted ret = get_item_details(args, self, for_validate=for_validate, overwrite_warehouse=False) - for fieldname, value in ret.items(): if item.meta.get_field(fieldname) and value is not None: if item.get(fieldname) is None or fieldname in force_item_fields: @@ -717,7 +715,10 @@ class AccountsController(TransactionBase): fieldname ): item.set(fieldname, value) - + elif fieldname == "item_tax_rate" and not ( + self.get("is_return") and self.get("return_against") + ): + item.set(fieldname, value) elif fieldname == "serial_no": # Ensure that serial numbers are matched against Stock UOM item_conversion_factor = item.get("conversion_factor") or 1.0 diff --git a/erpnext/controllers/sales_and_purchase_return.py b/erpnext/controllers/sales_and_purchase_return.py index eca751f76bc..ba13287ca66 100644 --- a/erpnext/controllers/sales_and_purchase_return.py +++ b/erpnext/controllers/sales_and_purchase_return.py @@ -334,6 +334,8 @@ def make_return_doc(doctype: str, source_name: str, target_doc=None): def set_missing_values(source, target): doc = frappe.get_doc(target) doc.is_return = 1 + doc.ignore_pricing_rule = 1 + doc.pricing_rules = [] doc.return_against = source.name doc.set_warehouse = "" if doctype == "Sales Invoice" or doctype == "POS Invoice": @@ -397,6 +399,7 @@ def make_return_doc(doctype: str, source_name: str, target_doc=None): def update_item(source_doc, target_doc, source_parent): target_doc.qty = -1 * source_doc.qty + target_doc.pricing_rules = None if source_doc.serial_no: returned_serial_nos = get_returned_serial_nos(source_doc, source_parent) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 7d371bdf9a6..f7bf5634878 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -90,6 +90,9 @@ class calculate_taxes_and_totals: self.doc.base_tax_withholding_net_total = sum_base_net_amount def validate_item_tax_template(self): + if self.doc.get("is_return") and self.doc.get("return_against"): + return + for item in self._items: if item.item_code and item.get("item_tax_template"): item_doc = frappe.get_cached_doc("Item", item.item_code) @@ -238,7 +241,6 @@ class calculate_taxes_and_totals: "tax_fraction_for_current_item", "grand_total_fraction_for_current_item", ] - if tax.charge_type != "Actual" and not ( self.discount_amount_applied and self.doc.apply_discount_on == "Grand Total" ): diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js index 98c1434e4d0..f774528ee86 100644 --- a/erpnext/public/js/controllers/transaction.js +++ b/erpnext/public/js/controllers/transaction.js @@ -1817,6 +1817,8 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe let item_rates = {}; let item_tax_templates = {}; + if (me.frm.doc.is_return && me.frm.doc.return_against) return; + $.each(this.frm.doc.items || [], function(i, item) { if (item.item_code) { // Use combination of name and item code in case same item is added multiple times From c87f2d2f7c049f06039a2baa80b76ed846bd053b Mon Sep 17 00:00:00 2001 From: vishnu Date: Wed, 28 Aug 2024 15:10:08 +0000 Subject: [PATCH 15/18] fix: retain date filter when redirecting in Profit and Loss report (cherry picked from commit bb29fc4c3d9e55a5dff14529b37d1bc78b0fb3cc) --- erpnext/public/js/financial_statements.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js index d489c91c305..8cea4dc91b9 100644 --- a/erpnext/public/js/financial_statements.js +++ b/erpnext/public/js/financial_statements.js @@ -113,16 +113,17 @@ erpnext.financial_statements = { onload: function (report) { // dropdown for links to other financial statements erpnext.financial_statements.filters = get_filters(); + var filters = report.get_values(); - let fiscal_year = erpnext.utils.get_fiscal_year(frappe.datetime.get_today()); - - frappe.model.with_doc("Fiscal Year", fiscal_year, function (r) { - var fy = frappe.model.get_doc("Fiscal Year", fiscal_year); - frappe.query_report.set_filter_value({ - period_start_date: fy.year_start_date, - period_end_date: fy.year_end_date, + if (!filters.period_start_date || !filters.period_end_date) { + frappe.model.with_doc("Fiscal Year", fiscal_year, function (r) { + var fy = frappe.model.get_doc("Fiscal Year", fiscal_year); + frappe.query_report.set_filter_value({ + period_start_date: fy.year_start_date, + period_end_date: fy.year_end_date, + }); }); - }); + } const views_menu = report.page.add_custom_button_group(__("Financial Statements")); From e8cfb4d60284a45b771ee180a43beeb52c6cad19 Mon Sep 17 00:00:00 2001 From: vishnu Date: Wed, 28 Aug 2024 15:12:22 +0000 Subject: [PATCH 16/18] fix: indentation (cherry picked from commit 598e9c1390d756ed0f1f0afa80fa13efe94af820) --- erpnext/public/js/financial_statements.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/public/js/financial_statements.js b/erpnext/public/js/financial_statements.js index 8cea4dc91b9..25620de834d 100644 --- a/erpnext/public/js/financial_statements.js +++ b/erpnext/public/js/financial_statements.js @@ -113,6 +113,8 @@ erpnext.financial_statements = { onload: function (report) { // dropdown for links to other financial statements erpnext.financial_statements.filters = get_filters(); + + let fiscal_year = erpnext.utils.get_fiscal_year(frappe.datetime.get_today()); var filters = report.get_values(); if (!filters.period_start_date || !filters.period_end_date) { From 22b283d4a873de82a616dd799a284a08cad9be68 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Tue, 3 Sep 2024 15:54:39 +0530 Subject: [PATCH 17/18] fix: typerror on default_currency (cherry picked from commit 4a7cc4da8743599755f13588cfa25f9d58ad4998) --- erpnext/accounts/doctype/payment_entry/payment_entry.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.js b/erpnext/accounts/doctype/payment_entry/payment_entry.js index 2e5a278c492..2f9d5be07e7 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.js +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.js @@ -517,7 +517,7 @@ frappe.ui.form.on('Payment Entry', { frm.set_value("source_exchange_rate", 1); } else if (frm.doc.paid_from){ if (["Internal Transfer", "Pay"].includes(frm.doc.payment_type)) { - let company_currency = frappe.get_doc(":Company", frm.doc.company).default_currency; + let company_currency = frappe.get_doc(":Company", frm.doc.company)?.default_currency; frappe.call({ method: "erpnext.setup.utils.get_exchange_rate", args: { From 3912c688ac044a6f0026d329b7195315b94d261f Mon Sep 17 00:00:00 2001 From: Lakshit Jain <108322669+ljain112@users.noreply.github.com> Date: Wed, 4 Sep 2024 12:56:04 +0530 Subject: [PATCH 18/18] fix: adjust price insertion logic for internal suppliers/customers (#42988) * fix: adjust price insertion logic for internal suppliers/customers * refactor: correct indentation, specify conditions within function * fix: typo --------- Co-authored-by: Smit Vora (cherry picked from commit 38f925b376d4dc95c99c19b11a27ade2db6dc81f) --- erpnext/stock/get_item_details.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 0a8b7d407e4..c078a426c42 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -855,14 +855,10 @@ def get_price_list_rate(args, item_doc, out=None): if price_list_rate is None or frappe.db.get_single_value( "Stock Settings", "update_existing_price_list_rate" ): - if args.get("is_internal_supplier") or args.get("is_internal_customer"): - return out + insert_item_price(args) - if args.price_list and args.rate: - insert_item_price(args) - - if not price_list_rate: - return out + if price_list_rate is None: + return out out.price_list_rate = flt(price_list_rate) * flt(args.plc_conversion_rate) / flt(args.conversion_rate) @@ -883,6 +879,14 @@ def get_price_list_rate(args, item_doc, out=None): def insert_item_price(args): """Insert Item Price if Price List and Price List Rate are specified and currency is the same""" + if ( + not args.price_list + or not args.rate + or args.get("is_internal_supplier") + or args.get("is_internal_customer") + ): + return + if frappe.db.get_value("Price List", args.price_list, "currency", cache=True) == args.currency and cint( frappe.db.get_single_value("Stock Settings", "auto_insert_price_list_rate_if_missing") ):