Esempio n. 1
0
def test_prefers_current_stock_batches_to_shipments(days_after_today):
    in_stock = Batch('in-stock-batch', 'RETRO-CLOCK', 100, eta=None)
    shipment_batch = Batch('shipment-batch',
                           'RETRO-CLOCK',
                           100,
                           eta=days_after_today(1))
    line = OrderLine('oref', 'RETRO-CLOCK', 10)

    allocate(line, [in_stock, shipment_batch])

    assert in_stock.available_quantity == 90
    assert shipment_batch.available_quantity == 100
Esempio n. 2
0
def test_prefers_earlier_batches(days_after_today):
    earliest = Batch('speedy-batch', 'MINIMALIST-SPOON', 100, eta=date.today())
    medium = Batch('medium-batch',
                   'MINIMALIST-SPOON',
                   100,
                   eta=days_after_today(1))
    latest = Batch('latest-batch',
                   'MINIMALIST-SPOON',
                   100,
                   eta=days_after_today(2))

    line = OrderLine('order1', 'MINIMALIST-SPOON', 10)

    allocate(line, [medium, earliest, latest])

    assert earliest.available_quantity == 90
    assert medium.available_quantity == 100
    assert latest.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 reallocate(orderid: str, sku: str, qty: int, uow: unit_of_work.AbstractUnitOfWork) \
        -> str:
    line = OrderLine(orderid, sku, qty)
    with uow:
        batch = uow.batches.get(sku=line.sku)
        if batch is None:
            raise InvalidSku(f'Invalid sku {line.sku}')
        batch.deallocate(line)
        batches = uow.batches.list()
        batchref = model.allocate(line, batches)
        uow.commit()
    return batchref
Esempio n. 5
0
def test_returns_allocated_batch_ref(days_after_today):
    in_stock_batch = Batch('in-stock-batch-ref',
                           'HIGHBROW-POSTER',
                           100,
                           eta=None)
    shipment_batch = Batch('shipment-batch-ref',
                           'HIGHBROW-POSTER',
                           100,
                           eta=days_after_today(1))
    line = OrderLine('oref', 'HIGHBROW-POSTER', 10)
    allocation = allocate(line, [in_stock_batch, shipment_batch])

    assert allocation == in_stock_batch.reference
Esempio n. 6
0
def test_raises_out_of_stock_exception_if_cannot_allocate():
    batch = Batch('batch1', 'SMALL-FORK', 10, eta=date.today())
    allocate(OrderLine('order1', 'SMALL-FORK', 10), [batch])

    with pytest.raises(OutOfStock, match='SMALL-FORK'):
        allocate(OrderLine('order2', 'SMALL-FORK', 1), [batch])