Skip to content

Commit bd6269b

Browse files
fix: add drop ship logic in gross profit report (backport #54220) (#54277)
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com> fix: add drop ship logic in gross profit report (#54220)
1 parent d0bff47 commit bd6269b

2 files changed

Lines changed: 53 additions & 2 deletions

File tree

erpnext/accounts/report/gross_profit/gross_profit.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,11 @@ def process(self):
578578

579579
# get buying rate
580580
if flt(row.qty):
581-
row.buying_rate = flt(row.buying_amount / flt(row.qty), self.float_precision)
581+
row.buying_rate = (
582+
flt(row.buying_amount / flt(row.qty), self.float_precision)
583+
if not row.delivered_by_supplier
584+
else None
585+
)
582586
row.base_rate = flt(row.base_amount / flt(row.qty), self.float_precision)
583587
else:
584588
if self.is_not_invoice_row(row):
@@ -630,7 +634,8 @@ def update_return_invoices(self, row):
630634
returned_item_row.qty += row.qty
631635
returned_item_row.base_amount += row.base_amount
632636

633-
row.buying_amount = flt(flt(row.qty) * flt(row.buying_rate), self.currency_precision)
637+
if not row.delivered_by_supplier:
638+
row.buying_amount = flt(flt(row.qty) * flt(row.buying_rate), self.currency_precision)
634639

635640
def get_average_rate_based_on_group_by(self):
636641
for key in list(self.grouped):
@@ -799,6 +804,26 @@ def get_buying_amount(self, row, item_code):
799804
return self.calculate_buying_amount_from_sle(
800805
row, my_sle, parenttype, parent, item_row, item_code
801806
)
807+
elif (
808+
row.delivered_by_supplier
809+
and row.so_detail
810+
and (
811+
po_details := frappe.get_all(
812+
"Purchase Order Item",
813+
filters={"sales_order_item": row.so_detail, "docstatus": 1},
814+
pluck="name",
815+
)
816+
)
817+
):
818+
from frappe.query_builder.functions import Sum
819+
820+
table = frappe.qb.DocType("Purchase Invoice Item")
821+
query = (
822+
frappe.qb.from_(table)
823+
.select(Sum(table.stock_qty * table.base_net_rate))
824+
.where((table.po_detail.isin(po_details)) & (table.docstatus == 1))
825+
)
826+
return flt(query.run()[0][0])
802827
elif row.sales_order and row.so_detail:
803828
incoming_amount = self.get_buying_amount_from_so_dn(row.sales_order, row.so_detail, item_code)
804829
if incoming_amount:
@@ -951,6 +976,7 @@ def prepare_invoice_query(self):
951976
SalesInvoice.is_return,
952977
SalesInvoiceItem.cost_center,
953978
SalesInvoiceItem.serial_and_batch_bundle,
979+
SalesInvoiceItem.delivered_by_supplier,
954980
)
955981

956982
if self.filters.group_by == "Sales Person":

erpnext/accounts/report/gross_profit/test_gross_profit.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,31 @@ def test_sales_person_wise_gross_profit(self):
731731
self.assertEqual(total[7], 1000.0)
732732
self.assertEqual(total[8], 100.0)
733733

734+
def test_drop_ship(self):
735+
from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_invoice
736+
from erpnext.selling.doctype.sales_order.sales_order import make_purchase_order, make_sales_invoice
737+
from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order
738+
from erpnext.stock.doctype.item.test_item import make_item
739+
740+
item = make_item("_Test Drop Ship Item", properties={"is_stock_item": 1, "delivered_by_supplier": 1})
741+
742+
so = make_sales_order(item=item.name, qty=10, rate=100)
743+
po = make_purchase_order(so.name, selected_items=[so.items[0]])[0]
744+
po.items[0].rate = 80
745+
po.supplier = "_Test Supplier"
746+
po.submit()
747+
make_purchase_invoice(po.name).submit()
748+
si = make_sales_invoice(so.name).submit()
749+
750+
filters = frappe._dict(
751+
company=si.company, from_date=si.posting_date, to_date=si.posting_date, group_by="Invoice"
752+
)
753+
754+
_, data = execute(filters=filters)
755+
self.assertEqual(data[1].buying_amount, 800)
756+
self.assertIsNone(data[1].buying_rate)
757+
self.assertEqual(data[1]["gross_profit_%"], 20)
758+
734759

735760
def make_sales_person(sales_person_name="_Test Sales Person"):
736761
if not frappe.db.exists("Sales Person", {"sales_person_name": sales_person_name}):

0 commit comments

Comments
 (0)