63 lines
2.3 KiB
Python
63 lines
2.3 KiB
Python
from apps.livestock.models import LiveStockType
|
|
from apps.product.models import QuotaUsage, IncentivePlan
|
|
|
|
|
|
class QuotaUsageService:
|
|
|
|
@staticmethod
|
|
def allocate_usage(rancher, distribution, item_data, quota_stat=None):
|
|
""" save & calculate quota usage of rancher """
|
|
|
|
# purchase quota usage of rancher
|
|
if 'livestock_statistic' in item_data.keys(): # noqa
|
|
|
|
# get list of livestock types object for transaction item
|
|
livestock_types = {
|
|
lt.en_name: lt
|
|
for lt in LiveStockType.objects.filter(
|
|
en_name__in=[i['name'] for i in item_data.get('livestock_statistic', [])]
|
|
)
|
|
}
|
|
|
|
# get list of incentive plans object for transaction item
|
|
incentive_plans = {
|
|
iplan.id: iplan
|
|
for iplan in IncentivePlan.objects.all()
|
|
}
|
|
|
|
usages = [] # list of usages objects
|
|
for item in item_data['livestock_statistic']:
|
|
# get livestock by en name
|
|
livestock_type = livestock_types.get(item['name'])
|
|
if not livestock_types:
|
|
continue
|
|
|
|
# true or false
|
|
is_incentive = item['id'] != 0
|
|
|
|
# get usage & calculate
|
|
usage, created = QuotaUsage.objects.get_or_create(
|
|
rancher=rancher,
|
|
livestock_type=livestock_type,
|
|
distribution=distribution,
|
|
quota_stat=quota_stat,
|
|
incentive_plan=incentive_plans.get(item['id']) if is_incentive else None,
|
|
defaults={
|
|
"count": item['count'],
|
|
'usage_type': 'incentive' if is_incentive else 'base',
|
|
'incentive_quota_used': item['total_weight'] if is_incentive else 0,
|
|
'base_quota_used': item['total_weight'] if is_incentive else 0
|
|
}
|
|
)
|
|
|
|
if not created:
|
|
if usage.usage_type == 'incentive':
|
|
usage.incentive_quota_used += item['total_weight']
|
|
else:
|
|
usage.base_quota_used += item['total_weight']
|
|
usage.save()
|
|
|
|
usages.append(usage)
|
|
|
|
return usages
|