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
2 days ago
|
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
|