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