You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.9 KiB
54 lines
1.9 KiB
from . import models
|
|
from .models import StockOperation
|
|
|
|
def register_incoming_stock(product, quantity, warehouse, expiration_date=None):
|
|
operation = StockOperation.objects.create(
|
|
product=product,
|
|
quantity=quantity,
|
|
warehouse=warehouse,
|
|
operation_type='Incoming',
|
|
expiration_date=expiration_date
|
|
)
|
|
|
|
# Распределение по местам хранения
|
|
if product.storage_temperature:
|
|
storage_location = "Холодильник" if product.storage_temperature == "+4C" else "Полка"
|
|
operation.storage_location = storage_location
|
|
operation.save()
|
|
return operation
|
|
|
|
def transfer_stock(product, quantity, from_warehouse, to_location):
|
|
total_stock = StockOperation.objects.filter(
|
|
product=product, warehouse=from_warehouse, operation_type='Incoming'
|
|
).aggregate(total=models.Sum('quantity'))['total'] or 0
|
|
|
|
if total_stock < quantity:
|
|
raise ValueError("Недостаточно товара на складе для перемещения.")
|
|
|
|
transfer_operation = StockOperation.objects.create(
|
|
product=product,
|
|
quantity=quantity,
|
|
warehouse=from_warehouse,
|
|
storage_location=to_location,
|
|
operation_type='Transfer'
|
|
)
|
|
return transfer_operation
|
|
|
|
|
|
def write_off_stock(product, quantity, warehouse, reason):
|
|
total_stock = StockOperation.objects.filter(
|
|
product=product, warehouse=warehouse, operation_type='Incoming'
|
|
).aggregate(total=models.Sum('quantity'))['total'] or 0
|
|
|
|
if total_stock < quantity:
|
|
raise ValueError("Недостаточно товара на складе для списания.")
|
|
|
|
write_off_operation = StockOperation.objects.create(
|
|
product=product,
|
|
quantity=quantity,
|
|
warehouse=warehouse,
|
|
operation_type='WriteOff',
|
|
reason=reason
|
|
)
|
|
return write_off_operation
|