fix: serial no not able to reject for the internal transfer (#36467)
This commit is contained in:
@@ -475,6 +475,10 @@ class BuyingController(SubcontractingController):
|
|||||||
if d.item_code not in stock_items:
|
if d.item_code not in stock_items:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
rejected_qty = 0.0
|
||||||
|
if flt(d.rejected_qty) != 0:
|
||||||
|
rejected_qty = flt(flt(d.rejected_qty) * flt(d.conversion_factor), d.precision("stock_qty"))
|
||||||
|
|
||||||
if d.warehouse:
|
if d.warehouse:
|
||||||
pr_qty = flt(flt(d.qty) * flt(d.conversion_factor), d.precision("stock_qty"))
|
pr_qty = flt(flt(d.qty) * flt(d.conversion_factor), d.precision("stock_qty"))
|
||||||
|
|
||||||
@@ -495,6 +499,11 @@ class BuyingController(SubcontractingController):
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if flt(rejected_qty) != 0:
|
||||||
|
from_warehouse_sle["actual_qty"] += -1 * rejected_qty
|
||||||
|
if d.rejected_serial_no:
|
||||||
|
from_warehouse_sle["serial_no"] += "\n" + cstr(d.rejected_serial_no).strip()
|
||||||
|
|
||||||
sl_entries.append(from_warehouse_sle)
|
sl_entries.append(from_warehouse_sle)
|
||||||
|
|
||||||
sle = self.get_sl_entries(
|
sle = self.get_sl_entries(
|
||||||
@@ -520,6 +529,7 @@ class BuyingController(SubcontractingController):
|
|||||||
else 0,
|
else 0,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
sl_entries.append(sle)
|
sl_entries.append(sle)
|
||||||
|
|
||||||
if d.from_warehouse and (
|
if d.from_warehouse and (
|
||||||
@@ -530,23 +540,30 @@ class BuyingController(SubcontractingController):
|
|||||||
d, {"actual_qty": -1 * pr_qty, "warehouse": d.from_warehouse, "recalculate_rate": 1}
|
d, {"actual_qty": -1 * pr_qty, "warehouse": d.from_warehouse, "recalculate_rate": 1}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if flt(rejected_qty) != 0:
|
||||||
|
from_warehouse_sle["actual_qty"] += -1 * rejected_qty
|
||||||
|
if d.rejected_serial_no:
|
||||||
|
from_warehouse_sle["serial_no"] += "\n" + cstr(d.rejected_serial_no).strip()
|
||||||
|
|
||||||
sl_entries.append(from_warehouse_sle)
|
sl_entries.append(from_warehouse_sle)
|
||||||
|
|
||||||
if flt(d.rejected_qty) != 0:
|
if flt(rejected_qty) != 0:
|
||||||
sl_entries.append(
|
sl_entries.append(
|
||||||
self.get_sl_entries(
|
self.get_sl_entries(
|
||||||
d,
|
d,
|
||||||
{
|
{
|
||||||
"warehouse": d.rejected_warehouse,
|
"warehouse": d.rejected_warehouse,
|
||||||
"actual_qty": flt(flt(d.rejected_qty) * flt(d.conversion_factor), d.precision("stock_qty")),
|
"actual_qty": rejected_qty,
|
||||||
"serial_no": cstr(d.rejected_serial_no).strip(),
|
"serial_no": cstr(d.rejected_serial_no).strip(),
|
||||||
"incoming_rate": 0.0,
|
"incoming_rate": 0.0,
|
||||||
|
"allow_zero_valuation_rate": True,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
if self.get("is_old_subcontracting_flow"):
|
if self.get("is_old_subcontracting_flow"):
|
||||||
self.make_sl_entries_for_supplier_warehouse(sl_entries)
|
self.make_sl_entries_for_supplier_warehouse(sl_entries)
|
||||||
|
|
||||||
self.make_sl_entries(
|
self.make_sl_entries(
|
||||||
sl_entries,
|
sl_entries,
|
||||||
allow_negative_stock=allow_negative_stock,
|
allow_negative_stock=allow_negative_stock,
|
||||||
|
|||||||
@@ -1258,6 +1258,70 @@ class TestPurchaseReceipt(FrappeTestCase):
|
|||||||
|
|
||||||
self.assertEqual(query[0].value, 0)
|
self.assertEqual(query[0].value, 0)
|
||||||
|
|
||||||
|
def test_rejected_qty_for_internal_transfer(self):
|
||||||
|
from erpnext.stock.doctype.delivery_note.delivery_note import make_inter_company_purchase_receipt
|
||||||
|
from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
|
||||||
|
|
||||||
|
prepare_data_for_internal_transfer()
|
||||||
|
customer = "_Test Internal Customer 2"
|
||||||
|
company = "_Test Company with perpetual inventory"
|
||||||
|
|
||||||
|
from_warehouse = create_warehouse("_Test Internal From Warehouse New", company=company)
|
||||||
|
to_warehouse = create_warehouse("_Test Internal To Warehouse New", company=company)
|
||||||
|
rejected_warehouse = create_warehouse(
|
||||||
|
"_Test Rejected Internal To Warehouse New", company=company
|
||||||
|
)
|
||||||
|
item_doc = make_item(
|
||||||
|
"Test Internal Transfer Item DS",
|
||||||
|
{
|
||||||
|
"is_purchase_item": 1,
|
||||||
|
"is_stock_item": 1,
|
||||||
|
"has_serial_no": 1,
|
||||||
|
"serial_no_series": "SBNS.#####",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
target_warehouse = create_warehouse("_Test Internal GIT Warehouse New", company=company)
|
||||||
|
|
||||||
|
pr = make_purchase_receipt(
|
||||||
|
item_code=item_doc.name,
|
||||||
|
company=company,
|
||||||
|
posting_date=add_days(today(), -1),
|
||||||
|
warehouse=from_warehouse,
|
||||||
|
qty=2,
|
||||||
|
rate=100,
|
||||||
|
)
|
||||||
|
|
||||||
|
dn1 = create_delivery_note(
|
||||||
|
item_code=item_doc.name,
|
||||||
|
company=company,
|
||||||
|
customer=customer,
|
||||||
|
serial_no=pr.items[0].serial_no,
|
||||||
|
cost_center="Main - TCP1",
|
||||||
|
expense_account="Cost of Goods Sold - TCP1",
|
||||||
|
qty=2,
|
||||||
|
rate=500,
|
||||||
|
warehouse=from_warehouse,
|
||||||
|
target_warehouse=target_warehouse,
|
||||||
|
)
|
||||||
|
|
||||||
|
sns = get_serial_nos(dn1.items[0].serial_no)
|
||||||
|
|
||||||
|
self.assertEqual(len(sns), 2)
|
||||||
|
|
||||||
|
pr1 = make_inter_company_purchase_receipt(dn1.name)
|
||||||
|
pr1.items[0].qty = 1.0
|
||||||
|
pr1.items[0].rejected_qty = 1.0
|
||||||
|
pr1.items[0].serial_no = sns[0]
|
||||||
|
pr1.items[0].rejected_serial_no = sns[1]
|
||||||
|
pr1.items[0].warehouse = to_warehouse
|
||||||
|
pr1.items[0].rejected_warehouse = rejected_warehouse
|
||||||
|
pr1.submit()
|
||||||
|
|
||||||
|
rejected_serial_no_wh = frappe.get_cached_value("Serial No", sns[1], "warehouse")
|
||||||
|
|
||||||
|
self.assertEqual(rejected_warehouse, rejected_serial_no_wh)
|
||||||
|
|
||||||
def test_backdated_transaction_for_internal_transfer_in_trasit_warehouse_for_purchase_receipt(
|
def test_backdated_transaction_for_internal_transfer_in_trasit_warehouse_for_purchase_receipt(
|
||||||
self,
|
self,
|
||||||
):
|
):
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ def make_sl_entries(sl_entries, allow_negative_stock=False, via_landed_cost_vouc
|
|||||||
sle_doc = make_entry(sle, allow_negative_stock, via_landed_cost_voucher)
|
sle_doc = make_entry(sle, allow_negative_stock, via_landed_cost_voucher)
|
||||||
|
|
||||||
args = sle_doc.as_dict()
|
args = sle_doc.as_dict()
|
||||||
|
args["allow_zero_valuation_rate"] = sle.get("allow_zero_valuation_rate") or False
|
||||||
|
|
||||||
if sle.get("voucher_type") == "Stock Reconciliation":
|
if sle.get("voucher_type") == "Stock Reconciliation":
|
||||||
# preserve previous_qty_after_transaction for qty reposting
|
# preserve previous_qty_after_transaction for qty reposting
|
||||||
@@ -109,6 +110,7 @@ def repost_current_voucher(args, allow_negative_stock=False, via_landed_cost_vou
|
|||||||
"sle_id": args.get("name"),
|
"sle_id": args.get("name"),
|
||||||
"creation": args.get("creation"),
|
"creation": args.get("creation"),
|
||||||
},
|
},
|
||||||
|
allow_zero_rate=args.get("allow_zero_valuation_rate") or False,
|
||||||
allow_negative_stock=allow_negative_stock,
|
allow_negative_stock=allow_negative_stock,
|
||||||
via_landed_cost_voucher=via_landed_cost_voucher,
|
via_landed_cost_voucher=via_landed_cost_voucher,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user