first push
This commit is contained in:
284
panel/ProvinceOperator/helpers.py
Normal file
284
panel/ProvinceOperator/helpers.py
Normal file
@@ -0,0 +1,284 @@
|
||||
from django.db.models import Sum, Q
|
||||
from django.http import HttpResponse
|
||||
|
||||
from LiveStock.models import LiveStockAllocations, Rancher, LiveStockProduct, Cooperative, LiveStockRolseProduct, \
|
||||
CooperativeProductsShare
|
||||
from panel.convert_date import convert_to_miladi
|
||||
from panel.models import StewardAllocation, StewardFreeBarInformation, StewardFreeSaleBarInformation, \
|
||||
PosAllocationTransactions, PosMachineTransactions, PosSegmentation, ProductsTransactions, RolesProducts, \
|
||||
WarehouseArchive
|
||||
|
||||
|
||||
def guild_steward_free_buying_product_warehousing(product):
|
||||
guild_steward_free_buying_bars = StewardFreeBarInformation.objects.filter(
|
||||
Q(guild=product.guild) | Q(steward=product.guild), trash=False,warehouse=True)
|
||||
product.free_buying_carcasses_quantity = \
|
||||
guild_steward_free_buying_bars.aggregate(total=Sum('number_of_carcasses'))[
|
||||
'total'] or 0
|
||||
product.free_buying_carcasses_weight = \
|
||||
guild_steward_free_buying_bars.aggregate(total=Sum('weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
product.save()
|
||||
product.guild.total_out_province_buying_bars_weight = product.free_buying_carcasses_weight
|
||||
product.guild.save()
|
||||
|
||||
|
||||
def guild_steward_free_sale_product_warehousing(product):
|
||||
guild_steward_free_sale_bars = StewardFreeSaleBarInformation.objects.filter(
|
||||
Q(guild=product.guild) | Q(steward=product.guild), trash=False,warehouse=True)
|
||||
|
||||
product.out_province_allocated_quantity = guild_steward_free_sale_bars.aggregate(total=Sum('number_of_carcasses'))[
|
||||
'total'] or 0
|
||||
product.out_province_allocated_weight = guild_steward_free_sale_bars.aggregate(total=Sum('weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
out_province_governmental_allocated_weight = guild_steward_free_sale_bars.filter(quota='governmental').aggregate(total=Sum('weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
out_province_free_allocated_weight = guild_steward_free_sale_bars.filter(quota='free').aggregate(total=Sum('weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
|
||||
product.save()
|
||||
product.guild.total_selling_out_province_governmental_weight=out_province_governmental_allocated_weight
|
||||
product.guild.total_selling_out_province_free_weight = out_province_free_allocated_weight
|
||||
product.guild.save()
|
||||
|
||||
|
||||
def guild_steward_allocations_product_warehousing(product):
|
||||
guild_steward_allocations = StewardAllocation.objects.filter(
|
||||
Q(guilds=product.guild) | Q(to_guilds=product.guild) | Q(steward=product.guild) | Q(to_steward=product.guild),
|
||||
trash=False, calculate_status=True,warehouse=True,steward_warehouse=True)
|
||||
|
||||
guild_steward_allocated = guild_steward_allocations.filter(Q(guilds=product.guild) | Q(steward=product.guild))
|
||||
guild_steward_allocated_from = guild_steward_allocations.filter(
|
||||
Q(to_guilds=product.guild) | Q(to_steward=product.guild))
|
||||
|
||||
governmental_guild_steward_allocated_from = guild_steward_allocated_from.filter(quota='governmental')
|
||||
free_guild_steward_allocated_from = guild_steward_allocated_from.filter(quota='free')
|
||||
|
||||
product.province_allocated_quantity = \
|
||||
guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
|
||||
total=Sum('real_number_of_carcasses'))[
|
||||
'total'] or 0
|
||||
product.province_allocated_weight = \
|
||||
guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
|
||||
total=Sum('real_weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
|
||||
in_province_governmental_allocated_weight = \
|
||||
guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted'),quota='governmental').aggregate(
|
||||
total=Sum('real_weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
|
||||
in_province_free_allocated_weight = \
|
||||
guild_steward_allocated.filter(receiver_state__in=('pending', 'accepted'),quota='free').aggregate(
|
||||
total=Sum('real_weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
|
||||
product.receive_governmental_carcasses_quantity = \
|
||||
governmental_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate(
|
||||
total=Sum('receiver_real_number_of_carcasses'))[
|
||||
'total'] or 0
|
||||
product.receive_governmental_carcasses_weight = \
|
||||
governmental_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate(
|
||||
total=Sum('receiver_real_weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
product.receive_free_carcasses_quantity = \
|
||||
free_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate(
|
||||
total=Sum('receiver_real_number_of_carcasses'))[
|
||||
'total'] or 0
|
||||
product.receive_free_carcasses_weight = \
|
||||
free_guild_steward_allocated_from.filter(receiver_state='accepted').aggregate(
|
||||
total=Sum('receiver_real_weight_of_carcasses'))[
|
||||
'total'] or 0
|
||||
|
||||
product.save()
|
||||
product.guild.total_in_province_governmental_bars_weight = product.receive_governmental_carcasses_weight
|
||||
product.guild.total_in_province_free_bars_weight = product.receive_free_carcasses_weight
|
||||
product.guild.total_selling_in_province_governmental_weight = in_province_governmental_allocated_weight
|
||||
product.guild.total_selling_in_province_free_weight = in_province_free_allocated_weight
|
||||
product.guild.save()
|
||||
|
||||
|
||||
def allocation_calculate_price(allocation):
|
||||
transactions = PosAllocationTransactions.objects.filter(allocation=allocation, trash=False, paid=True)
|
||||
allocation.total_amount_paid = transactions.aggregate(total=Sum('price'))['total'] or 0
|
||||
allocation.save()
|
||||
|
||||
|
||||
def pos_allocation_weight_for_product(product):
|
||||
transactions = ProductsTransactions.objects.filter(product=product, transaction__paid=True, trash=False,warehouse=True)
|
||||
product.pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0
|
||||
product.save()
|
||||
pos_allocated_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0
|
||||
pos_governmental_allocated_weight = transactions.filter(price_approved=True).aggregate(total=Sum('cur_weight'))['total'] or 0
|
||||
pos_free_allocated_weight = transactions.filter(price_approved=False).aggregate(total=Sum('cur_weight'))['total'] or 0
|
||||
if product.kill_house:
|
||||
product.kill_house.pos_allocated_weight=int(pos_allocated_weight/1000)
|
||||
product.kill_house.pos_governmental_allocated_weight=int(pos_governmental_allocated_weight/1000)
|
||||
product.kill_house.pos_free_allocated_weight=int(pos_free_allocated_weight/1000)
|
||||
product.kill_house.save()
|
||||
else:
|
||||
product.guild.pos_allocated_weight=int(pos_allocated_weight/1000)
|
||||
product.guild.pos_governmental_allocated_weight=int(pos_governmental_allocated_weight/1000)
|
||||
product.guild.pos_free_allocated_weight=int(pos_free_allocated_weight/1000)
|
||||
product.guild.save()
|
||||
|
||||
|
||||
|
||||
def guild_steward_product_segmentation(product):
|
||||
if product.kill_house:
|
||||
segmentations = PosSegmentation.objects.filter(kill_house=product.kill_house, trash=False,warehouse=True)
|
||||
else:
|
||||
|
||||
segmentations = PosSegmentation.objects.filter(guild=product.guild, trash=False,warehouse=True)
|
||||
product.segmentation_weight = \
|
||||
segmentations.aggregate(total=Sum('weight'))[
|
||||
'total'] or 0
|
||||
product.save()
|
||||
if product.kill_house:
|
||||
product.kill_house.total_segmentation_governmental_weight = segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[
|
||||
'total'] or 0
|
||||
product.kill_house.total_segmentation_free_weight = segmentations.filter(quota='free').aggregate(total=Sum('weight'))[
|
||||
'total'] or 0
|
||||
product.kill_house.save()
|
||||
else:
|
||||
product.guild.total_segmentation_governmental_weight = segmentations.filter(quota='governmental').aggregate(total=Sum('weight'))[
|
||||
'total'] or 0
|
||||
product.guild.total_segmentation_free_weight = segmentations.filter(quota='free').aggregate(total=Sum('weight'))[
|
||||
'total'] or 0
|
||||
product.guild.save()
|
||||
|
||||
|
||||
|
||||
def guild_steward_archive_warehousing(guild):
|
||||
product = RolesProducts.objects.filter(guild=guild, trash=False, name='مرغ گرم').first()
|
||||
|
||||
archives = WarehouseArchive.objects.filter(Q(steward=guild)|Q(guild=guild),trash=False,warehouse=True)
|
||||
|
||||
archives_info = archives.aggregate(
|
||||
archives_weight=Sum('weight'),
|
||||
archives_governmental_weight=Sum('weight',
|
||||
filter=Q(quota='governmental')),
|
||||
archives_free_weight=Sum('weight',
|
||||
filter=Q(quota='free')),
|
||||
|
||||
)
|
||||
archives_weight = archives_info['archives_weight'] or 0
|
||||
archives_governmental_weight = archives_info['archives_governmental_weight'] or 0
|
||||
archives_free_weight = archives_info['archives_free_weight'] or 0
|
||||
product.ware_house_archive_weight = archives_weight
|
||||
product.save()
|
||||
guild.ware_house_archive_governmental_weight = archives_governmental_weight
|
||||
guild.ware_house_archive_free_weight = archives_free_weight
|
||||
guild.save()
|
||||
|
||||
|
||||
|
||||
def cooperative_warehousing(product):
|
||||
transactions = ProductsTransactions.objects.filter(live_stack_products=product, transaction__paid=True, trash=False)
|
||||
output_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0
|
||||
product.total_allocated_weight = output_weight
|
||||
product.save()
|
||||
|
||||
|
||||
def rancher_warehousing(transaction):
|
||||
# todo:دامدار با کد ملی چند تا بر گپمیرگرده باید بر اساس شناسه گله بشه
|
||||
rancher = Rancher.objects.filter(national_id=transaction.natcode).order_by('herd_code').first()
|
||||
if rancher:
|
||||
transactions = ProductsTransactions.objects.filter(transaction=transaction, transaction__paid=True, trash=False)
|
||||
output_weight = transactions.aggregate(total=Sum('cur_weight'))['total'] or 0
|
||||
rancher.total_weight = output_weight
|
||||
rancher.save()
|
||||
|
||||
|
||||
def update_role_product(request):
|
||||
products=LiveStockProduct.objects.filter(trash=False).exclude(name__in=('جو','سویا','ذرت','سبوس'))
|
||||
cooperative=Cooperative.objects.filter(trash=False)
|
||||
for c in cooperative:
|
||||
for p in products:
|
||||
live=LiveStockRolseProduct(
|
||||
parent_product=p,
|
||||
cooperative=c,
|
||||
)
|
||||
live.save()
|
||||
return HttpResponse('ok')
|
||||
|
||||
|
||||
def update_cooperative_share(request):
|
||||
products=LiveStockProduct.objects.filter(trash=False).exclude(name__in=('جو','سویا','ذرت','سبوس'))
|
||||
cooperative=Cooperative.objects.filter(trash=False)
|
||||
for c in cooperative:
|
||||
for p in products:
|
||||
live=CooperativeProductsShare(
|
||||
product=p,
|
||||
cooperative=c,
|
||||
)
|
||||
live.save()
|
||||
return HttpResponse('ok')
|
||||
|
||||
|
||||
def calculate_bad_transactions():
|
||||
transactions = PosMachineTransactions.objects.filter(trash=False, paid=False, live_stock=True, result='تراکنش موفق',
|
||||
state=0)
|
||||
for transaction in transactions:
|
||||
product_transaction = ProductsTransactions.objects.filter(transaction=transaction,
|
||||
trash=False,
|
||||
live_stack_products__isnull=False).first()
|
||||
if product_transaction:
|
||||
cooperative_warehousing(product_transaction.live_stack_products)
|
||||
rancher_warehousing(transaction)
|
||||
transaction.paid = True
|
||||
transaction.save()
|
||||
|
||||
|
||||
|
||||
|
||||
def _normalize_fa_ar(text):
|
||||
"""نرمالایز کردن متن فارسی/عربی"""
|
||||
if not text:
|
||||
return text
|
||||
mapping = {
|
||||
'ك': 'ک',
|
||||
'ي': 'ی',
|
||||
'ى': 'ی',
|
||||
'\u0649': 'ی',
|
||||
'\u06CC': 'ی',
|
||||
'\u064A': 'ی',
|
||||
'ۀ': 'ه',
|
||||
'ة': 'ه',
|
||||
'ؤ': 'و',
|
||||
'أ': 'ا',
|
||||
'إ': 'ا',
|
||||
'ٱ': 'ا',
|
||||
'\u200c': ' ',
|
||||
}
|
||||
out = str(text)
|
||||
for src, dst in mapping.items():
|
||||
out = out.replace(src, dst)
|
||||
return out.strip()
|
||||
|
||||
def parse_yes_no(val):
|
||||
"""تبدیل مقدار به boolean"""
|
||||
if isinstance(val, bool):
|
||||
return val
|
||||
if isinstance(val, str):
|
||||
return False if val == 'خیر' else True
|
||||
return bool(val)
|
||||
|
||||
def persian_date_to_datetime(persian_date_str):
|
||||
"""تبدیل تاریخ فارسی به datetime"""
|
||||
if not persian_date_str:
|
||||
return None
|
||||
try:
|
||||
persian_numbers = '۰۱۲۳۴۵۶۷۸۹'
|
||||
english_numbers = '0123456789'
|
||||
translation_table = str.maketrans(persian_numbers, english_numbers)
|
||||
english_date = persian_date_str.translate(translation_table)
|
||||
parts = english_date.split('/')
|
||||
if len(parts) != 3:
|
||||
return None
|
||||
year = int(parts[0])
|
||||
month = int(parts[1])
|
||||
day = int(parts[2])
|
||||
return convert_to_miladi(year=year, month=month, day=day)
|
||||
except:
|
||||
return None
|
||||
Reference in New Issue
Block a user