Files
2026-01-18 11:45:53 +03:30

284 lines
13 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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