first push

This commit is contained in:
2026-01-18 11:45:53 +03:30
commit 6bcd71d9ec
702 changed files with 272997 additions and 0 deletions

View 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