mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-27 02:28:30 +00:00
* fix(stock entry): calculate transferred quantity using transfer_qty (cherry picked from commit4e6d86d6f0) # Conflicts: # erpnext/stock/doctype/stock_entry/stock_entry.py * test: allow from_warehouse while creating material request (cherry picked from commit7e99148357) * test: validate transferred quantity for material transfer entry (cherry picked from commitbf2ab32abf) * chore: fix conflicts --------- Co-authored-by: Navin-S-R <navin@aerele.in> Co-authored-by: rohitwaghchaure <rohitw1991@gmail.com>
This commit is contained in:
@@ -1004,7 +1004,8 @@ def make_material_request(**args):
|
|||||||
mr = frappe.new_doc("Material Request")
|
mr = frappe.new_doc("Material Request")
|
||||||
mr.material_request_type = args.material_request_type or "Purchase"
|
mr.material_request_type = args.material_request_type or "Purchase"
|
||||||
mr.company = args.company or "_Test Company"
|
mr.company = args.company or "_Test Company"
|
||||||
mr.customer = args.customer or "_Test Customer"
|
if mr.material_request_type == "Customer Provided":
|
||||||
|
mr.customer = args.customer or "_Test Customer"
|
||||||
mr.append(
|
mr.append(
|
||||||
"items",
|
"items",
|
||||||
{
|
{
|
||||||
@@ -1013,6 +1014,7 @@ def make_material_request(**args):
|
|||||||
"uom": args.uom or "_Test UOM",
|
"uom": args.uom or "_Test UOM",
|
||||||
"conversion_factor": args.conversion_factor or 1,
|
"conversion_factor": args.conversion_factor or 1,
|
||||||
"schedule_date": args.schedule_date or today(),
|
"schedule_date": args.schedule_date or today(),
|
||||||
|
"from_warehouse": args.from_warehouse,
|
||||||
"warehouse": args.warehouse or "_Test Warehouse - _TC",
|
"warehouse": args.warehouse or "_Test Warehouse - _TC",
|
||||||
"cost_center": args.cost_center or "_Test Cost Center - _TC",
|
"cost_center": args.cost_center or "_Test Cost Center - _TC",
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -2807,7 +2807,7 @@ class StockEntry(StockController):
|
|||||||
stock_entries_child_list.append(d.ste_detail)
|
stock_entries_child_list.append(d.ste_detail)
|
||||||
transferred_qty = frappe.get_all(
|
transferred_qty = frappe.get_all(
|
||||||
"Stock Entry Detail",
|
"Stock Entry Detail",
|
||||||
fields=["sum(qty) as qty"],
|
fields=["sum(transfer_qty) as qty"],
|
||||||
filters={
|
filters={
|
||||||
"against_stock_entry": d.against_stock_entry,
|
"against_stock_entry": d.against_stock_entry,
|
||||||
"ste_detail": d.ste_detail,
|
"ste_detail": d.ste_detail,
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ from erpnext.stock.doctype.item.test_item import (
|
|||||||
make_item_variant,
|
make_item_variant,
|
||||||
set_item_variant_settings,
|
set_item_variant_settings,
|
||||||
)
|
)
|
||||||
|
from erpnext.stock.doctype.material_request.material_request import (
|
||||||
|
make_in_transit_stock_entry,
|
||||||
|
)
|
||||||
|
from erpnext.stock.doctype.material_request.test_material_request import (
|
||||||
|
get_in_transit_warehouse,
|
||||||
|
make_material_request,
|
||||||
|
)
|
||||||
from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
|
from erpnext.stock.doctype.serial_and_batch_bundle.test_serial_and_batch_bundle import (
|
||||||
get_batch_from_bundle,
|
get_batch_from_bundle,
|
||||||
get_serial_nos_from_bundle,
|
get_serial_nos_from_bundle,
|
||||||
@@ -2127,6 +2134,59 @@ class TestStockEntry(FrappeTestCase):
|
|||||||
self.assertEqual(se.purpose, "Repack")
|
self.assertEqual(se.purpose, "Repack")
|
||||||
self.assertRaises(frappe.ValidationError, se.submit)
|
self.assertRaises(frappe.ValidationError, se.submit)
|
||||||
|
|
||||||
|
def test_transferred_qty_in_material_transfer(self):
|
||||||
|
item_code = "_Test Item"
|
||||||
|
source_warehouse = "_Test Warehouse - _TC"
|
||||||
|
target_warehouse = "_Test Warehouse 1 - _TC"
|
||||||
|
|
||||||
|
if not frappe.db.get_value("UOM Conversion Detail", {"parent": item_code, "uom": "Box"}):
|
||||||
|
item_doc = frappe.get_doc("Item", item_code)
|
||||||
|
item_doc.append("uoms", {"uom": "Box", "conversion_factor": 12})
|
||||||
|
item_doc.save(ignore_permissions=True)
|
||||||
|
|
||||||
|
make_stock_entry(item_code=item_code, target=source_warehouse, qty=12, rate=100)
|
||||||
|
|
||||||
|
# Create a Material Request for Material Transfer
|
||||||
|
material_request = make_material_request(
|
||||||
|
material_request_type="Material Transfer",
|
||||||
|
qty=1,
|
||||||
|
item_code=item_code,
|
||||||
|
uom="Box",
|
||||||
|
conversion_factor=12,
|
||||||
|
from_warehouse=source_warehouse,
|
||||||
|
warehouse=target_warehouse,
|
||||||
|
)
|
||||||
|
in_transit_wh = get_in_transit_warehouse(material_request.company)
|
||||||
|
|
||||||
|
# Create first Stock Entry (Source -> In-Transit)
|
||||||
|
stock_entry_1 = make_in_transit_stock_entry(material_request.name, in_transit_wh)
|
||||||
|
stock_entry_1.items[0].update(
|
||||||
|
{
|
||||||
|
"qty": 1,
|
||||||
|
"s_warehouse": source_warehouse,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
stock_entry_1.save().submit()
|
||||||
|
|
||||||
|
# Validate transfer status after first transfer
|
||||||
|
material_request.reload()
|
||||||
|
self.assertEqual(material_request.transfer_status, "In Transit")
|
||||||
|
|
||||||
|
# Create final Stock Entry (In-Transit -> Target)
|
||||||
|
end_transit_1 = make_stock_in_entry(stock_entry_1.name)
|
||||||
|
end_transit_1.save().submit()
|
||||||
|
end_transit_1.reload()
|
||||||
|
|
||||||
|
# Validate quantities
|
||||||
|
stock_entry_1.reload()
|
||||||
|
self.assertEqual(stock_entry_1.items[0].qty, 1)
|
||||||
|
self.assertEqual(stock_entry_1.items[0].transfer_qty, 12)
|
||||||
|
self.assertEqual(stock_entry_1.items[0].transferred_qty, 12)
|
||||||
|
|
||||||
|
# Validate transfer status after final transfer
|
||||||
|
material_request.reload()
|
||||||
|
self.assertEqual(material_request.transfer_status, "Completed")
|
||||||
|
|
||||||
|
|
||||||
def make_serialized_item(**args):
|
def make_serialized_item(**args):
|
||||||
args = frappe._dict(args)
|
args = frappe._dict(args)
|
||||||
|
|||||||
Reference in New Issue
Block a user