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
|