def test_prefers_current_stock_batches_to_shipments(): in_stock_batch = Batch("in-stock-batch", "RETRO-CLOCK", 100, eta=None) shipment_batch = Batch("shipment-batch", "RETRO-CLOCK", 100, eta=tomorrow) line = OrderLine("oref", "RETRO-CLOCK", 10) allocate(line, [in_stock_batch, shipment_batch]) assert in_stock_batch.available_quantity == 90 assert shipment_batch.available_quantity == 100
def test_prefers_earlier_batches(): earliest = Batch("speedy-batch", "RETRO-CLOCK", 100, eta=today) medium = Batch("normal-batch", "RETRO-CLOCK", 100, eta=tomorrow) latest = Batch("slow-batch", "RETRO-CLOCK", 100, eta=later) line = OrderLine("oref", "RETRO-CLOCK", 10) allocate(line, [medium, latest, earliest]) assert earliest.available_quantity == 90 assert medium.available_quantity == 100 assert latest.available_quantity == 100
def allocate( orderid: str, sku: str, qty: int, repo: AbstractRepository, session ) -> str: line = OrderLine(orderid, sku, qty) batches = repo.list() if not is_valid_sku(line.sku, batches): raise InvalidSku(f'Invalid sku {line.sku}') batchref = model.allocate(line, batches) session.commit() return batchref
def allocate( event: events.AllocationRequired, uow: unit_of_work.AbstractUnitOfWork ) -> str: line = OrderLine(event.orderid, event.sku, event.qty) with uow: product = uow.products.get(sku=event.sku) if product is None: raise InvalidSku(f'Invalid SKU {line.sku}') batchref = product.allocate(line) uow.commit() return batchref
def test_prefers_warehouse_batches_to_shipments(): in_stock_batch = Batch("in-stock-batch", "RETRO-CLOCK", 100, eta=None) shipment_batch = Batch("shipment-batch", "RETRO-CLOCK", 100, eta=tomorrow) repo = FakeRepository([in_stock_batch, shipment_batch]) session = FakeSession() line = OrderLine('oref', "RETRO-CLOCK", 10) handlers.allocate(line, repo, session) assert in_stock_batch.available_quantity == 90 assert shipment_batch.available_quantity == 100
def allocate( orderid: str, sku: str, qty: int, uow: unit_of_work.AbstractUnitOfWork, ) -> str: line = OrderLine(orderid, sku, qty) with uow: batches = uow.batches.list() if not is_valid_sku(line.sku, batches): raise InvalidSku(f'Invalid sku {line.sku}') batchref = model.allocate(line, batches) uow.commit() return batchref
def test_returns_allocated_batch_ref(): in_stock_batch = Batch("in-stock-batch-ref", "HIGHBROW-POSTER", 100, eta=None) shipment_batch = Batch("shipment-batch-ref", "HIGHBROW-POSTER", 100, eta=tomorrow) line = OrderLine("oref", "HIGHBROW-POSTER", 10) allocation = allocate(line, [in_stock_batch, shipment_batch]) assert allocation == in_stock_batch.reference
def test_cannot_allocate_if_skus_do_not_match(): batch = Batch("batch-001", "UNCOMFORTABLE-CHAIR", 100, eta=None) different_sku_line = OrderLine("order-123", "EXPENSIVE-TOASTER", 10) assert batch.can_allocate(different_sku_line) is False
def make_batch_and_line(sku, batch_qty, line_qty): return ( Batch("batch-001", sku, batch_qty, eta=date.today()), OrderLine("order-123", sku, line_qty) )
def test_raises_out_of_stock_exception_if_cannot_allocate(): batch = Batch('batch1', 'SMALL-FORK', 10, eta=today) allocate(OrderLine('order1', 'SMALL-FORK', 10), [batch]) with pytest.raises(OutOfStock, match='SMALL-FORK'): allocate(OrderLine('order2', 'SMALL-FORK', 1), [batch])
def test_allocating_to_a_batch_reduces_the_quantity(): batch = Batch("batch-001", "SMALL-TABLE", qty=20, eta=date.today()) line = OrderLine('order-ref', "SMALL-TABLE", 2) batch.allocate(line) assert batch.available_quantity == 18
async def get(self, id_: UUID) -> OrderLine: data = database[id_] print("GET, data", data) orderdata = OrderLine(**data) return orderdata
def test_allocating_to_a_batch_reduces_the_available_quantity(): batch = Batch(ref="batch-001", sku="SMALL-TABLE", purchased_quantity=20) line = OrderLine(orderid="order-ref", sku="SMALLs-TABLE", qty=2) batch.allocate(line) print(batch.allocations)