mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-24 05:47:15 +00:00
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
This commit is contained in:
@@ -4440,6 +4440,12 @@ def move_sample_to_retention_warehouse(company, items):
|
||||
|
||||
@frappe.whitelist()
|
||||
def make_stock_in_entry(source_name, target_doc=None):
|
||||
qty_precision = frappe.get_precision("Stock Entry Detail", "transfer_qty")
|
||||
|
||||
def get_remaining_transfer_qty(source_doc):
|
||||
remaining_qty = flt(source_doc.transfer_qty) - flt(source_doc.transferred_qty)
|
||||
return flt(remaining_qty, qty_precision)
|
||||
|
||||
def set_missing_values(source, target):
|
||||
target.stock_entry_type = "Material Transfer"
|
||||
target.set_missing_values()
|
||||
@@ -4459,7 +4465,7 @@ def make_stock_in_entry(source_name, target_doc=None):
|
||||
target_doc.t_warehouse = warehouse
|
||||
|
||||
target_doc.s_warehouse = source_doc.t_warehouse
|
||||
target_doc.qty = source_doc.qty - source_doc.transferred_qty
|
||||
target_doc.qty = get_remaining_transfer_qty(source_doc) / flt(source_doc.conversion_factor)
|
||||
|
||||
doclist = get_mapped_doc(
|
||||
"Stock Entry",
|
||||
@@ -4479,7 +4485,7 @@ def make_stock_in_entry(source_name, target_doc=None):
|
||||
"batch_no": "batch_no",
|
||||
},
|
||||
"postprocess": update_item,
|
||||
"condition": lambda doc: flt(doc.qty) - flt(doc.transferred_qty) > 0.00001,
|
||||
"condition": lambda doc: get_remaining_transfer_qty(doc) > 0,
|
||||
},
|
||||
},
|
||||
target_doc,
|
||||
|
||||
@@ -307,6 +307,84 @@ class TestStockEntry(ERPNextTestSuite):
|
||||
)
|
||||
self.assertRaises(frappe.ValidationError, se.save)
|
||||
|
||||
def test_end_transit_qty_with_uom_conversion(self):
|
||||
"""transferred_qty is tracked in the stock UOM, so the end transit qty must be converted back."""
|
||||
company = "_Test Company"
|
||||
source_warehouse = "_Test Warehouse - _TC"
|
||||
target_warehouse = "_Test Warehouse 1 - _TC"
|
||||
transit_warehouse = get_in_transit_warehouse(company)
|
||||
|
||||
item_code = make_item(
|
||||
"_Test Transit UOM Conversion Item",
|
||||
{"is_stock_item": 1, "stock_uom": "Nos", "uoms": [{"uom": "Kg", "conversion_factor": 0.5}]},
|
||||
).name
|
||||
|
||||
make_stock_entry(item_code=item_code, target=source_warehouse, qty=100, basic_rate=100)
|
||||
|
||||
transit_entry = make_stock_entry(
|
||||
item_code=item_code,
|
||||
source=source_warehouse,
|
||||
target=transit_warehouse,
|
||||
purpose="Material Transfer",
|
||||
add_to_transit=1,
|
||||
qty=10,
|
||||
basic_rate=100,
|
||||
do_not_save=True,
|
||||
)
|
||||
transit_entry.items[0].uom = "Kg"
|
||||
transit_entry.items[0].conversion_factor = 0.5
|
||||
transit_entry.save().submit()
|
||||
self.assertEqual(transit_entry.items[0].transfer_qty, 5)
|
||||
|
||||
partial_entry = make_stock_in_entry(transit_entry.name)
|
||||
partial_entry.to_warehouse = target_warehouse
|
||||
partial_entry.items[0].qty = 4
|
||||
partial_entry.items[0].t_warehouse = target_warehouse
|
||||
partial_entry.save().submit()
|
||||
|
||||
remaining_entry = make_stock_in_entry(transit_entry.name)
|
||||
self.assertEqual(remaining_entry.items[0].uom, "Kg")
|
||||
self.assertEqual(remaining_entry.items[0].qty, 6)
|
||||
|
||||
remaining_entry.to_warehouse = target_warehouse
|
||||
remaining_entry.items[0].t_warehouse = target_warehouse
|
||||
remaining_entry.save().submit()
|
||||
|
||||
self.assertFalse(make_stock_in_entry(transit_entry.name).get("items"))
|
||||
|
||||
def test_end_transit_maps_smallest_remaining_qty(self):
|
||||
"""The smallest storable remainder survives binary subtraction, 2.001 - 2 is 0.0009999999999998899."""
|
||||
company = "_Test Company"
|
||||
source_warehouse = "_Test Warehouse - _TC"
|
||||
target_warehouse = "_Test Warehouse 1 - _TC"
|
||||
transit_warehouse = get_in_transit_warehouse(company)
|
||||
|
||||
item_code = make_item(
|
||||
"_Test Transit Fractional Item", {"is_stock_item": 1, "stock_uom": "Litre"}
|
||||
).name
|
||||
smallest_qty = 1 / (10 ** frappe.get_precision("Stock Entry Detail", "transfer_qty"))
|
||||
|
||||
make_stock_entry(item_code=item_code, target=source_warehouse, qty=100, basic_rate=100)
|
||||
|
||||
transit_entry = make_stock_entry(
|
||||
item_code=item_code,
|
||||
source=source_warehouse,
|
||||
target=transit_warehouse,
|
||||
purpose="Material Transfer",
|
||||
add_to_transit=1,
|
||||
qty=2 + smallest_qty,
|
||||
basic_rate=100,
|
||||
)
|
||||
|
||||
partial_entry = make_stock_in_entry(transit_entry.name)
|
||||
partial_entry.to_warehouse = target_warehouse
|
||||
partial_entry.items[0].qty = 2
|
||||
partial_entry.items[0].t_warehouse = target_warehouse
|
||||
partial_entry.save().submit()
|
||||
|
||||
remaining_entry = make_stock_in_entry(transit_entry.name)
|
||||
self.assertEqual(remaining_entry.items[0].qty, smallest_qty)
|
||||
|
||||
def test_material_receipt_gl_entry(self):
|
||||
company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user