284 lines
13 KiB
Python
284 lines
13 KiB
Python
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 |