From df41b006fc85f76dc064366fca07cac9da0f86d3 Mon Sep 17 00:00:00 2001 From: s-aga-r Date: Sun, 15 Jan 2023 21:09:16 +0530 Subject: [PATCH 1/6] chore: `Sales Order` link in `Pick List` (cherry picked from commit b3759890d703764d8b4a40125fb6df466a2e4b82) --- erpnext/stock/doctype/pick_list/pick_list_dashboard.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/pick_list/pick_list_dashboard.py b/erpnext/stock/doctype/pick_list/pick_list_dashboard.py index 92e57bed220..7fbcbafbac1 100644 --- a/erpnext/stock/doctype/pick_list/pick_list_dashboard.py +++ b/erpnext/stock/doctype/pick_list/pick_list_dashboard.py @@ -1,7 +1,10 @@ def get_data(): return { "fieldname": "pick_list", + "internal_links": { + "Sales Order": ["locations", "sales_order"], + }, "transactions": [ - {"items": ["Stock Entry", "Delivery Note"]}, + {"items": ["Stock Entry", "Sales Order", "Delivery Note"]}, ], } From 23b9f661b641f9727cfdbad24f58110d839da5a9 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 16 Jan 2023 08:50:39 +0530 Subject: [PATCH 2/6] revert: Reverting changes done on 33495 (#33662) 'ordered_qty' will not be fetched from `tabBin` (cherry picked from commit be382054e5c14aab2b021feba780ef9f78225f81) --- erpnext/stock/doctype/item/test_item.py | 1 - erpnext/stock/get_item_details.py | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/stock/doctype/item/test_item.py b/erpnext/stock/doctype/item/test_item.py index 7e426ae4af8..53f6b7f8f17 100644 --- a/erpnext/stock/doctype/item/test_item.py +++ b/erpnext/stock/doctype/item/test_item.py @@ -106,7 +106,6 @@ class TestItem(FrappeTestCase): "conversion_factor": 1.0, "reserved_qty": 1, "actual_qty": 5, - "ordered_qty": 10, "projected_qty": 14, } diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index f7fcb30acd2..363dc0a63f3 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -1181,7 +1181,7 @@ def get_projected_qty(item_code, warehouse): @frappe.whitelist() def get_bin_details(item_code, warehouse, company=None, include_child_warehouses=False): - bin_details = {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0, "ordered_qty": 0} + bin_details = {"projected_qty": 0, "actual_qty": 0, "reserved_qty": 0} if warehouse: from frappe.query_builder.functions import Coalesce, Sum @@ -1197,7 +1197,6 @@ def get_bin_details(item_code, warehouse, company=None, include_child_warehouses Coalesce(Sum(bin.projected_qty), 0).as_("projected_qty"), Coalesce(Sum(bin.actual_qty), 0).as_("actual_qty"), Coalesce(Sum(bin.reserved_qty), 0).as_("reserved_qty"), - Coalesce(Sum(bin.ordered_qty), 0).as_("ordered_qty"), ) .where((bin.item_code == item_code) & (bin.warehouse.isin(warehouses))) ).run(as_dict=True)[0] From faea73a4eed9849b5942861f9755c197f433c6a6 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 16 Jan 2023 08:49:35 +0530 Subject: [PATCH 3/6] Revert "fix: Updating SO throws ordered_qty not allowed to change after submission" (#33646) (cherry picked from commit 333907b7a52890856a2bcfa794e886ae11d2c340) --- erpnext/selling/doctype/sales_order_item/sales_order_item.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/erpnext/selling/doctype/sales_order_item/sales_order_item.json b/erpnext/selling/doctype/sales_order_item/sales_order_item.json index cfbd94b401b..50ae3a3f1a9 100644 --- a/erpnext/selling/doctype/sales_order_item/sales_order_item.json +++ b/erpnext/selling/doctype/sales_order_item/sales_order_item.json @@ -639,7 +639,6 @@ "width": "70px" }, { - "allow_on_submit": 1, "fieldname": "ordered_qty", "fieldtype": "Float", "label": "Ordered Qty", @@ -866,7 +865,7 @@ "idx": 1, "istable": 1, "links": [], - "modified": "2023-01-12 13:13:28.691585", + "modified": "2022-12-25 02:51:10.247569", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order Item", From 8a498ed029b9ffc2adc8eadade070f154ff5d768 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sat, 14 Jan 2023 12:22:22 +0530 Subject: [PATCH 4/6] perf: improve reconciliation speed on JE's with 1000's of rows 1. No need to keep old PLE's on reconciliation. 2. Added Validation to catch debit-credit mismatch on JE's 3. Only update outstanding amount for newly reconciled invoices (cherry picked from commit 11cf694d9a1833758788d87baf70db35a87c2f08) --- erpnext/accounts/utils.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 7ba433ea8c8..31885ac07b3 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -439,8 +439,7 @@ def reconcile_against_document(args): # nosemgrep # cancel advance entry doc = frappe.get_doc(voucher_type, voucher_no) frappe.flags.ignore_party_validation = True - gl_map = doc.build_gl_map() - create_payment_ledger_entry(gl_map, cancel=1, adv_adj=1) + _delete_pl_entries(voucher_type, voucher_no) for entry in entries: check_if_advance_entry_modified(entry) @@ -452,11 +451,23 @@ def reconcile_against_document(args): # nosemgrep else: update_reference_in_payment_entry(entry, doc, do_not_save=True) + if doc.doctype == "Journal Entry": + try: + doc.validate_total_debit_and_credit() + except Exception as validation_exception: + raise frappe.ValidationError(_(f"Validation Error for {doc.name}")) from validation_exception + doc.save(ignore_permissions=True) # re-submit advance entry doc = frappe.get_doc(entry.voucher_type, entry.voucher_no) gl_map = doc.build_gl_map() - create_payment_ledger_entry(gl_map, cancel=0, adv_adj=1) + create_payment_ledger_entry(gl_map, update_outstanding="No", cancel=0, adv_adj=1) + + # Only update outstanding for newly linked vouchers + for entry in entries: + update_voucher_outstanding( + entry.against_voucher_type, entry.against_voucher, entry.account, entry.party_type, entry.party + ) frappe.flags.ignore_party_validation = False From bddf3307542cdf98d16016c94d11a775ace019db Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 15 Jan 2023 18:09:51 +0530 Subject: [PATCH 5/6] fix: minor filter issue while reconciliation tool from bench console (cherry picked from commit 828eaf09301d84ebf78afb69e620c8d38a51e036) --- .../doctype/payment_reconciliation/payment_reconciliation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index ac033f7db60..13712cee01d 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -471,6 +471,7 @@ class PaymentReconciliation(Document): def build_qb_filter_conditions(self, get_invoices=False, get_return_invoices=False): self.common_filter_conditions.clear() + self.accounting_dimension_filter_conditions.clear() self.ple_posting_date_filter.clear() ple = qb.DocType("Payment Ledger Entry") From 0431a57ff067e492fdedd3bd767c7acb1402e00d Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Sun, 15 Jan 2023 20:51:54 +0530 Subject: [PATCH 6/6] fix: attribute error while submitting Repost PLE (cherry picked from commit 2c50f43cdd6c185e0a5474e9a73ab6d3e404d765) --- .../repost_payment_ledger/repost_payment_ledger.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py b/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py index 400e07da6ab..209cad4f905 100644 --- a/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py +++ b/erpnext/accounts/doctype/repost_payment_ledger/repost_payment_ledger.py @@ -101,10 +101,9 @@ def execute_repost_payment_ledger(docname): job_name = "payment_ledger_repost_" + docname - if not frappe.utils.background_jobs.is_job_queued(job_name): - frappe.enqueue( - method="erpnext.accounts.doctype.repost_payment_ledger.repost_payment_ledger.start_payment_ledger_repost", - docname=docname, - is_async=True, - job_name=job_name, - ) + frappe.enqueue( + method="erpnext.accounts.doctype.repost_payment_ledger.repost_payment_ledger.start_payment_ledger_repost", + docname=docname, + is_async=True, + job_name=job_name, + )