127 lines
3.5 KiB
Python
127 lines
3.5 KiB
Python
# Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors
|
|
# See license.txt
|
|
|
|
import frappe
|
|
|
|
from erpnext.stock.report.stock_ageing.stock_ageing import FIFOSlots
|
|
from erpnext.tests.utils import ERPNextTestCase
|
|
|
|
|
|
class TestStockAgeing(ERPNextTestCase):
|
|
def setUp(self) -> None:
|
|
self.filters = frappe._dict(
|
|
company="_Test Company",
|
|
to_date="2021-12-10"
|
|
)
|
|
|
|
def test_normal_inward_outward_queue(self):
|
|
"Reference: Case 1 in stock_ageing_fifo_logic.md"
|
|
sle = [
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=30, qty_after_transaction=30,
|
|
posting_date="2021-12-01", voucher_type="Stock Entry",
|
|
voucher_no="001",
|
|
has_serial_no=False, serial_no=None
|
|
),
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=20, qty_after_transaction=50,
|
|
posting_date="2021-12-02", voucher_type="Stock Entry",
|
|
voucher_no="002",
|
|
has_serial_no=False, serial_no=None
|
|
),
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=(-10), qty_after_transaction=40,
|
|
posting_date="2021-12-03", voucher_type="Stock Entry",
|
|
voucher_no="003",
|
|
has_serial_no=False, serial_no=None
|
|
)
|
|
]
|
|
|
|
slots = FIFOSlots(self.filters, sle).generate()
|
|
|
|
self.assertTrue(slots["Flask Item"]["fifo_queue"])
|
|
result = slots["Flask Item"]
|
|
queue = result["fifo_queue"]
|
|
|
|
self.assertEqual(result["qty_after_transaction"], result["total_qty"])
|
|
self.assertEqual(queue[0][0], 20.0)
|
|
|
|
def test_insufficient_balance(self):
|
|
"Reference: Case 3 in stock_ageing_fifo_logic.md"
|
|
sle = [
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=(-30), qty_after_transaction=(-30),
|
|
posting_date="2021-12-01", voucher_type="Stock Entry",
|
|
voucher_no="001",
|
|
has_serial_no=False, serial_no=None
|
|
),
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=20, qty_after_transaction=(-10),
|
|
posting_date="2021-12-02", voucher_type="Stock Entry",
|
|
voucher_no="002",
|
|
has_serial_no=False, serial_no=None
|
|
),
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=20, qty_after_transaction=10,
|
|
posting_date="2021-12-03", voucher_type="Stock Entry",
|
|
voucher_no="003",
|
|
has_serial_no=False, serial_no=None
|
|
),
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=10, qty_after_transaction=20,
|
|
posting_date="2021-12-03", voucher_type="Stock Entry",
|
|
voucher_no="004",
|
|
has_serial_no=False, serial_no=None
|
|
)
|
|
]
|
|
|
|
slots = FIFOSlots(self.filters, sle).generate()
|
|
|
|
result = slots["Flask Item"]
|
|
queue = result["fifo_queue"]
|
|
|
|
self.assertEqual(result["qty_after_transaction"], result["total_qty"])
|
|
self.assertEqual(queue[0][0], 10.0)
|
|
self.assertEqual(queue[1][0], 10.0)
|
|
|
|
def test_stock_reconciliation(self):
|
|
sle = [
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=30, qty_after_transaction=30,
|
|
posting_date="2021-12-01", voucher_type="Stock Entry",
|
|
voucher_no="001",
|
|
has_serial_no=False, serial_no=None
|
|
),
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=0, qty_after_transaction=50,
|
|
posting_date="2021-12-02", voucher_type="Stock Reconciliation",
|
|
voucher_no="002",
|
|
has_serial_no=False, serial_no=None
|
|
),
|
|
frappe._dict(
|
|
name="Flask Item",
|
|
actual_qty=(-10), qty_after_transaction=40,
|
|
posting_date="2021-12-03", voucher_type="Stock Entry",
|
|
voucher_no="003",
|
|
has_serial_no=False, serial_no=None
|
|
)
|
|
]
|
|
|
|
slots = FIFOSlots(self.filters, sle).generate()
|
|
|
|
result = slots["Flask Item"]
|
|
queue = result["fifo_queue"]
|
|
|
|
self.assertEqual(result["qty_after_transaction"], result["total_qty"])
|
|
self.assertEqual(queue[0][0], 20.0)
|
|
self.assertEqual(queue[1][0], 20.0)
|