From 21a9eedb5c48c5a4d0c1bae24341c7ca7ffd6a73 Mon Sep 17 00:00:00 2001 From: Sudharsanan Ashok <135326972+Sudharsanan11@users.noreply.github.com> Date: Mon, 18 May 2026 22:33:10 +0530 Subject: [PATCH] fix(stock): update buying amount calculation in gross profit report (#55020) --- .../report/gross_profit/gross_profit.py | 40 +++++++++---------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/erpnext/accounts/report/gross_profit/gross_profit.py b/erpnext/accounts/report/gross_profit/gross_profit.py index dfba16a77eb..71af2b9d211 100644 --- a/erpnext/accounts/report/gross_profit/gross_profit.py +++ b/erpnext/accounts/report/gross_profit/gross_profit.py @@ -812,19 +812,11 @@ class GrossProfitGenerator: return self.calculate_buying_amount_from_sle( row, my_sle, parenttype, parent, row.item_row, item_code ) - elif self.delivery_notes.get((row.parent, row.item_code), None): - # check if Invoice has delivery notes - dn = self.delivery_notes.get((row.parent, row.item_code)) - parenttype, parent, item_row, dn_warehouse = ( - "Delivery Note", - dn["delivery_note"], - dn["item_row"], - dn["warehouse"], - ) - my_sle = self.get_stock_ledger_entries(item_code, dn_warehouse) - return self.calculate_buying_amount_from_sle( - row, my_sle, parenttype, parent, item_row, item_code - ) + elif row.item_row and self.delivery_notes.get(row.item_row): + dn = self.delivery_notes[row.item_row] + if flt(dn.total_qty): + return flt(row.qty) * flt(dn.total_incoming_value) / flt(dn.total_qty) + return flt(row.qty) * self.get_average_buying_rate(row, item_code) elif row.sales_order and row.so_detail: incoming_amount = self.get_buying_amount_from_so_dn(row.sales_order, row.so_detail, item_code) if incoming_amount: @@ -1076,25 +1068,29 @@ class GrossProfitGenerator: def get_delivery_notes(self): self.delivery_notes = frappe._dict({}) if self.si_list: + from frappe.query_builder.functions import Sum + invoices = [x.parent for x in self.si_list] dni = qb.DocType("Delivery Note Item") delivery_notes = ( qb.from_(dni) .select( - dni.against_sales_invoice.as_("sales_invoice"), - dni.item_code, - dni.warehouse, - dni.parent.as_("delivery_note"), - dni.name.as_("item_row"), + dni.si_detail, + Sum(dni.stock_qty * dni.incoming_rate).as_("total_incoming_value"), + Sum(dni.stock_qty).as_("total_qty"), ) - .where((dni.docstatus == 1) & (dni.against_sales_invoice.isin(invoices))) - .groupby(dni.against_sales_invoice, dni.item_code) - .orderby(dni.creation, order=Order.desc) + .where( + (dni.docstatus == 1) + & (dni.against_sales_invoice.isin(invoices)) + & (dni.si_detail.isnotnull()) + & (dni.si_detail != "") + ) + .groupby(dni.si_detail) .run(as_dict=True) ) for entry in delivery_notes: - self.delivery_notes[(entry.sales_invoice, entry.item_code)] = entry + self.delivery_notes[entry.si_detail] = entry def group_items_by_invoice(self): """