Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: incorrect ordered qty for Subcontracting Order (backport #38415) #38419

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions erpnext/controllers/tests/test_subcontracting_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -1001,6 +1001,7 @@ def make_subcontracted_items():
"Subcontracted Item SA5": {},
"Subcontracted Item SA6": {},
"Subcontracted Item SA7": {},
"Subcontracted Item SA8": {},
}

for item, properties in sub_contracted_items.items():
Expand All @@ -1020,6 +1021,7 @@ def make_raw_materials():
},
"Subcontracted SRM Item 4": {"has_serial_no": 1, "serial_no_series": "SRII.####"},
"Subcontracted SRM Item 5": {"has_serial_no": 1, "serial_no_series": "SRIID.####"},
"Subcontracted SRM Item 8": {},
}

for item, properties in raw_materials.items():
Expand All @@ -1043,6 +1045,7 @@ def make_service_items():
"Subcontracted Service Item 5": {},
"Subcontracted Service Item 6": {},
"Subcontracted Service Item 7": {},
"Subcontracted Service Item 8": {},
}

for item, properties in service_items.items():
Expand All @@ -1066,6 +1069,7 @@ def make_bom_for_subcontracted_items():
"Subcontracted Item SA5": ["Subcontracted SRM Item 5"],
"Subcontracted Item SA6": ["Subcontracted SRM Item 3"],
"Subcontracted Item SA7": ["Subcontracted SRM Item 1"],
"Subcontracted Item SA8": ["Subcontracted SRM Item 8"],
}

for item_code, raw_materials in boms.items():
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from erpnext.buying.doctype.purchase_order.purchase_order import is_subcontracting_order_created
from erpnext.controllers.subcontracting_controller import SubcontractingController
from erpnext.stock.stock_balance import get_ordered_qty, update_bin_qty
from erpnext.stock.stock_balance import update_bin_qty
from erpnext.stock.utils import get_bin


Expand Down Expand Up @@ -114,7 +114,32 @@ def update_ordered_qty_for_subcontracting(self, sco_item_rows=None):
):
item_wh_list.append([item.item_code, item.warehouse])
for item_code, warehouse in item_wh_list:
update_bin_qty(item_code, warehouse, {"ordered_qty": get_ordered_qty(item_code, warehouse)})
update_bin_qty(
item_code, warehouse, {"ordered_qty": self.get_ordered_qty(item_code, warehouse)}
)

@staticmethod
def get_ordered_qty(item_code, warehouse):
table = frappe.qb.DocType("Subcontracting Order")
child = frappe.qb.DocType("Subcontracting Order Item")

query = (
frappe.qb.from_(table)
.inner_join(child)
.on(table.name == child.parent)
.select((child.qty - child.received_qty) * child.conversion_factor)
.where(
(table.docstatus == 1)
& (child.item_code == item_code)
& (child.warehouse == warehouse)
& (child.qty > child.received_qty)
& (table.status != "Completed")
)
)

query = query.run()

return flt(query[0][0]) if query else 0

def update_reserved_qty_for_subcontracting(self):
for item in self.supplied_items:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import frappe
from frappe.tests.utils import FrappeTestCase
from frappe.utils import flt

from erpnext.buying.doctype.purchase_order.purchase_order import get_mapped_subcontracting_order
from erpnext.controllers.subcontracting_controller import (
Expand Down Expand Up @@ -566,6 +567,67 @@ def test_get_materials_from_supplier(self):
self.assertEqual(sco.status, "Closed")
self.assertEqual(sco.supplied_items[0].returned_qty, 5)

def test_ordered_qty_for_subcontracting_order(self):
service_items = [
{
"warehouse": "_Test Warehouse - _TC",
"item_code": "Subcontracted Service Item 8",
"qty": 10,
"rate": 100,
"fg_item": "Subcontracted Item SA8",
"fg_item_qty": 10,
},
]

ordered_qty = frappe.db.get_value(
"Bin",
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "Subcontracted Item SA8"},
fieldname="ordered_qty",
)
ordered_qty = flt(ordered_qty)

sco = get_subcontracting_order(service_items=service_items)
sco.reload()

new_ordered_qty = frappe.db.get_value(
"Bin",
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "Subcontracted Item SA8"},
fieldname="ordered_qty",
)
new_ordered_qty = flt(new_ordered_qty)

self.assertEqual(ordered_qty + 10, new_ordered_qty)

for row in sco.supplied_items:
make_stock_entry(
target="_Test Warehouse 1 - _TC",
item_code=row.rm_item_code,
qty=row.required_qty,
basic_rate=100,
)

scr = make_subcontracting_receipt(sco.name)
scr.submit()

new_ordered_qty = frappe.db.get_value(
"Bin",
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "Subcontracted Item SA8"},
fieldname="ordered_qty",
)

self.assertEqual(ordered_qty, new_ordered_qty)

scr.reload()
scr.cancel()

new_ordered_qty = frappe.db.get_value(
"Bin",
filters={"warehouse": "_Test Warehouse - _TC", "item_code": "Subcontracted Item SA8"},
fieldname="ordered_qty",
)

self.assertEqual(ordered_qty + 10, new_ordered_qty)


def create_subcontracting_order(**args):
args = frappe._dict(args)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,12 +95,12 @@ def on_cancel(self):
)
self.update_status_updater_args()
self.update_prevdoc_status()
self.update_stock_ledger()
self.make_gl_entries_on_cancel()
self.repost_future_sle_and_gle()
self.delete_auto_created_batches()
self.set_consumed_qty_in_subcontract_order()
self.set_subcontracting_order_status()
self.update_stock_ledger()
self.make_gl_entries_on_cancel()
self.repost_future_sle_and_gle()
self.update_status()

def validate_items_qty(self):
Expand Down