58 lines
2.0 KiB
Python
58 lines
2.0 KiB
Python
from django.db import transaction
|
|
from rest_framework import status
|
|
|
|
from apps.product.models import QuotaDistribution, OrganizationQuotaStats
|
|
from apps.warehouse.exceptions import WareHouseException
|
|
from apps.warehouse.models import InventoryEntry, InventoryEntryAllocation
|
|
|
|
|
|
class WarehouseAllocationService:
|
|
|
|
@staticmethod
|
|
def allocate(entry: InventoryEntry):
|
|
"""
|
|
Auto allocate entry.total_weight between multiple distributions
|
|
"""
|
|
with transaction.atomic():
|
|
distributions = QuotaDistribution.objects.filter(
|
|
assigned_organization=entry.organization,
|
|
quota=entry.distribution.quota
|
|
).select_related('quota').order_by('-create_date')
|
|
|
|
if not distributions.exists():
|
|
raise WareHouseException("توزیعی برای این انبار وجود ندارد", status.HTTP_403_FORBIDDEN) # noqa
|
|
|
|
remaining = entry.weight
|
|
|
|
for dist in distributions:
|
|
if remaining <= 0:
|
|
break
|
|
|
|
stat = OrganizationQuotaStats.objects.get(
|
|
quota=dist.quota,
|
|
organization=dist.assigned_organization
|
|
)
|
|
capacity = stat.remaining_amount
|
|
|
|
if capacity <= 0:
|
|
continue
|
|
|
|
allocate_weight = min(remaining, capacity)
|
|
|
|
InventoryEntryAllocation.objects.create(
|
|
distribution=dist,
|
|
entry=entry,
|
|
weight=allocate_weight
|
|
)
|
|
|
|
stat.inventory_received += allocate_weight
|
|
stat.save()
|
|
|
|
remaining -= allocate_weight
|
|
|
|
if remaining > 0:
|
|
raise WareHouseException(
|
|
"مقدار ورد شده از انبار بیشتر از مقدار کل سهمیه توزیع داده شده است",
|
|
status.HTTP_400_BAD_REQUEST
|
|
)
|