import datetime
import jdatetime
import requests
import uuid
from django.db.models import Sum, Q, Case, When, F, FloatField
from django.http import HttpResponse
from rest_framework.response import Response

from deposit_id import wage_counting_type, province_id, out_selling_ignore, new_out_selling_count_wage, \
    new_out_selling_count_wage_date, before_out_buying_count_wage_amount, market_code_state
from general_urls import base_url_for_sms_report
from panel.models import KillHouseRequest, KillHouseFreeBarInformation, ColdHouseAllocations, \
    KillHouseFreeSaleBarInformation, StewardAllocation, ProvinceKillRequest, WageType, InternalTransaction, KillHouse, \
    BarDifferenceRequest, PercentageOfWageType, RolesProducts, KillHouseWareHouse, KillRequest, \
    ProvinceCheckOperatorRequest, PoultryRequest, KillHousePercentage, IndexWeightCategory, PosSegmentation, \
    WarehouseArchive
from ticket.models import TicketSupport, MessageSupport


def kill_house_requests_product_warehousing(product):
    # kill_house_requests = KillHouseRequest.objects.filter(killhouse_user=product.kill_house,input_warehouse=product.kill_house,
    #                                                       ware_house_confirmation=True, trash=False,
    #                                                       calculate_status=True,warehouse=True)
    kill_house_requests = KillHouseRequest.objects.filter(input_warehouse=product.kill_house,
                                                          ware_house_confirmation=True, trash=False,
                                                          calculate_status=True, warehouse=True)
    governmental_kill_house_requests = kill_house_requests.filter(
        province_request__poultry_request__free_sale_in_province=False)
    free_kill_house_requests = kill_house_requests.filter(province_request__poultry_request__free_sale_in_province=True)
    # Q(province_request__poultry_request__free_sale_in_province=True) | Q(
    #     province_request__poultry_request__direct_buying=True))
    product.province_governmental_carcasses_quantity = \
        governmental_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_quantity'))['total'] or 0
    product.province_governmental_carcasses_weight = \
        governmental_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))[
            'total'] or 0
    product.province_free_carcasses_quantity = \
        free_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_quantity'))['total'] or 0
    product.province_free_carcasses_weight = \
        free_kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))[
            'total'] or 0
    product.save()

    governmental_commitment_weight = \
        governmental_kill_house_requests.aggregate(total=Sum('warehouse_commitment_weight'))[
            'total'] or 0
    free_commitment_weight = \
        free_kill_house_requests.aggregate(total=Sum('warehouse_commitment_weight'))['total'] or 0

    product.kill_house.total_in_province_governmental_bars_weight = product.province_governmental_carcasses_weight
    product.kill_house.total_in_province_free_bars_weight = product.province_free_carcasses_weight
    product.kill_house.total_in_province_governmental_bars_commitment_weight = governmental_commitment_weight
    product.kill_house.total_in_province_free_bars_commitment_weight = free_commitment_weight
    product.kill_house.save()


def kill_house_free_buying_product_warehousing(product):
    # kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(kill_house=product.kill_house, trash=False,
    #                                                                          calculate_status=True,warehouse=True,input_warehouse=product.kill_house) \
    #     .exclude(entered_message='ورود به انبار مجازی')

    kill_house_free_buying_bars = KillHouseFreeBarInformation.objects.filter(trash=False,
                                                                             calculate_status=True, warehouse=True,
                                                                             input_warehouse=product.kill_house) \
        .exclude(entered_message='ورود به انبار مجازی')
    product.free_buying_carcasses_quantity = \
        kill_house_free_buying_bars.aggregate(total=Sum('number_of_carcasses'))['total'] or 0
    product.free_buying_carcasses_weight = \
        kill_house_free_buying_bars.aggregate(total=Sum('weight_of_carcasses'))[
            'total'] or 0
    product.save()
    free_commitment_weight = \
        kill_house_free_buying_bars.aggregate(total=Sum('warehouse_commitment_weight'))[
            'total'] or 0
    product.kill_house.total_out_province_buying_bars_weight = product.free_buying_carcasses_weight
    product.kill_house.total_out_province_buying_bars_commitment_weight = free_commitment_weight
    product.kill_house.save()


def kill_house_archive_warehousing(kill_house):
    product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()

    archives = WarehouseArchive.objects.filter(kill_house=kill_house, 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()
    kill_house.ware_house_archive_governmental_weight = archives_governmental_weight
    kill_house.ware_house_archive_free_weight = archives_free_weight
    kill_house.save()


def kill_house_cold_house_allocations_product_warehousing(product):
    cold_house_allocations = ColdHouseAllocations.objects.filter(kill_house=product.kill_house,
                                                                 state__in=('pending', 'accepted'),
                                                                 trash=False)

    product.freezing_quantity = cold_house_allocations.aggregate(total=Sum('real_quantity'))[
                                    'total'] or 0
    product.freezing_weight = cold_house_allocations.aggregate(total=Sum('real_weight'))[
                                  'total'] or 0
    product.save()


def kill_house_cold_house_allocations(cold_house):
    cold_house_allocations = StewardAllocation.objects.filter(kill_house=cold_house.kill_house,
                                                              to_cold_house=cold_house, receiver_state='accepted',
                                                              trash=False, warehouse=True)

    cold_house.total_input_weight = cold_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
                                        'total'] or 0
    cold_house.save()
    cold_house.kill_house.total_cold_house_governmental_weight = \
        cold_house_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    cold_house.kill_house.total_cold_house_free_weight = \
        cold_house_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    cold_house.kill_house.save()


def cold_house_warehousing(cold_house):
    cold_house_allocations = StewardAllocation.objects.filter(
        Q(to_cold_house=cold_house) | Q(other_cold_house=cold_house), receiver_state__in=('accepted', 'pending'),
        trash=False, warehouse=True)
    input_allocations = cold_house_allocations.filter(
        Q(kill_house__isnull=False, to_cold_house=cold_house) | Q(
            kill_house__isnull=True, other_cold_house=cold_house),
        receiver_state='accepted')
    output_allocations = cold_house_allocations.filter(
        Q(to_steward__isnull=False) | Q(to_guilds__isnull=False) | Q(other_cold_house__isnull=False),
        kill_house__isnull=True, to_cold_house=cold_house)

    cold_house.total_input_weight = input_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
                                        'total'] or 0
    cold_house.total_allocated_weight = output_allocations.aggregate(total=Sum('real_weight_of_carcasses'))[
                                            'total'] or 0
    cold_house.save()
    cold_house.kill_house.total_cold_house_governmental_weight = \
        output_allocations.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    cold_house.kill_house.total_cold_house_free_weight = \
        output_allocations.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    cold_house.kill_house.save()


def kill_house_allocations_product_warehousing(product):
    kill_house_allocations = StewardAllocation.objects.filter(
        Q(kill_house=product.kill_house) | Q(to_kill_house=product.kill_house), trash=False, calculate_status=True,
        warehouse=True)
    kill_house_allocated = kill_house_allocations.filter(kill_house__isnull=False, to_cold_house__isnull=True)
    kill_house_governmental_allocated = kill_house_allocations.filter(kill_house__isnull=False,
                                                                      to_cold_house__isnull=True, quota='governmental')
    kill_house_free_allocated = kill_house_allocations.filter(kill_house__isnull=False, to_cold_house__isnull=True,
                                                              quota='free')
    kill_house_allocated_from = kill_house_allocations.filter(kill_house__isnull=True, to_cold_house__isnull=True)
    governmental_kill_house_allocated_from = kill_house_allocated_from.filter(approved_price_status=True)
    free_kill_house_allocated_from = kill_house_allocated_from.filter(approved_price_status=False)
    cold_house_allocations = kill_house_allocations.filter(to_cold_house__isnull=False,
                                                           receiver_state__in=('pending', 'accepted'))

    product.province_allocated_quantity = \
        kill_house_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
            total=Sum('real_number_of_carcasses'))[
            'total'] or 0
    product.province_allocated_weight = \
        kill_house_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
            total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    product.province_governmental_allocated_weight = \
        kill_house_governmental_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
            total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    product.province_free_allocated_weight = \
        kill_house_free_allocated.filter(receiver_state__in=('pending', 'accepted')).aggregate(
            total=Sum('real_weight_of_carcasses'))[
            'total'] or 0

    product.receive_governmental_carcasses_quantity = \
        governmental_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
            total=Sum('receiver_real_number_of_carcasses'))[
            'total'] or 0
    product.receive_governmental_carcasses_weight = \
        governmental_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
            total=Sum('receiver_real_weight_of_carcasses'))[
            'total'] or 0

    product.receive_free_carcasses_quantity = \
        free_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
            total=Sum('receiver_real_number_of_carcasses'))[
            'total'] or 0
    product.receive_free_carcasses_weight = \
        free_kill_house_allocated_from.filter(receiver_state='accepted').aggregate(
            total=Sum('receiver_real_weight_of_carcasses'))[
            'total'] or 0

    product.cold_house_allocated_weight = cold_house_allocations.aggregate(
        total=Sum('real_weight_of_carcasses'))[
                                              'total'] or 0

    product.save()
    product.kill_house.total_selling_in_province_governmental_weight = product.province_governmental_allocated_weight
    product.kill_house.total_selling_in_province_free_weight = product.province_free_allocated_weight
    product.kill_house.save()


def kill_house_free_sale_product_warehousing(product):
    kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=product.kill_house,

                                                                               trash=False, calculate_status=True,
                                                                               warehouse=True)

    product.out_province_allocated_quantity = \
        kill_house_free_sale_bars.aggregate(total=Sum('real_number_of_carcasses'))[
            'total'] or 0
    product.out_province_allocated_weight = kill_house_free_sale_bars.aggregate(total=Sum('real_weight_of_carcasses'))[
                                                'total'] or 0
    # return ({"len(1)":product.out_province_allocated_quantity,"2":product.out_province_allocated_weight})
    product.save()
    product.kill_house.total_selling_out_province_governmental_weight = \
        kill_house_free_sale_bars.filter(quota='governmental').aggregate(total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    product.kill_house.total_selling_out_province_free_weight = \
        kill_house_free_sale_bars.filter(quota='free').aggregate(total=Sum('real_weight_of_carcasses'))[
            'total'] or 0
    product.kill_house.save()


def get_new_wage_for_free_buying(kill_house_free_sale_bar_info):
    final_date = '2025-05-28'
    after_total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__gt=new_out_selling_count_wage_date,
                                             quarantine_weight_of_carcasses=0).aggregate(
            total=Sum('real_weight_of_carcasses'))['total'] or 0
    after_new_total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__gt=new_out_selling_count_wage_date,
                                             quarantine_weight_of_carcasses__gt=0).aggregate(
            total_weight=Sum(
                Case(
                    When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
                         then=F('real_weight_of_carcasses')),
                    default=F('quarantine_weight_of_carcasses'),
                    output_field=FloatField()
                )
            )
        )

    # before_total_out_selling_province_carcasses_weight = \
    #     kill_house_free_sale_bar_info.filter(date__date__lte=final_date).filter(date__date__lte=new_out_selling_count_wage_date,
    #                                          quarantine_weight_of_carcasses=0).aggregate(
    #         total=Sum('real_weight_of_carcasses'))['total'] or 0

    before_total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__lte=final_date).aggregate(
            total=Sum('real_weight_of_carcasses'))['total'] or 0
    # before_new_total_out_selling_province_carcasses_weight = \
    #     kill_house_free_sale_bar_info.filter(date__date__gt=final_date).filter(date__date__lte=new_out_selling_count_wage_date,
    #                                          quarantine_weight_of_carcasses__gt=0).aggregate(
    #         total_weight=Sum(
    #             Case(
    #                 When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
    #                      then=F('real_weight_of_carcasses')),
    #                 default=F('quarantine_weight_of_carcasses'),
    #                 output_field=FloatField()
    #             )
    #         )
    #     )
    before_new_total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__gte=final_date, date__date__lt=new_out_selling_count_wage_date,
                                             quarantine_weight_of_carcasses__gt=0).aggregate(
            total_weight=Sum(
                Case(
                    When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
                         then=F('real_weight_of_carcasses')),
                    default=F('quarantine_weight_of_carcasses'),
                    output_field=FloatField()
                )
            )
        )
    before_new_out_selling = before_new_total_out_selling_province_carcasses_weight['total_weight'] or 0
    before_total_out_selling_province_carcasses_weight += before_new_out_selling
    after_new_out_selling = after_new_total_out_selling_province_carcasses_weight['total_weight'] or 0
    after_total_out_selling_province_carcasses_weight += after_new_out_selling

    return {
        "before_new_out_selling": before_new_out_selling,
        "before_total_out_selling_province_carcasses_weight": before_total_out_selling_province_carcasses_weight,
        "after_new_out_selling": after_new_out_selling,
        "after_total_out_selling_province_carcasses_weight": after_total_out_selling_province_carcasses_weight,
    }


# def get_finance_info(kill_house, date1=None, date2=None):
#     before_total_out_live_buying_province_carcasses_weight = 0
#     after_total_out_live_buying_province_carcasses_weight = 0
#     before_new_out_selling = 0
#     after_new_out_selling = 0
#     extra_company_amount = 0
#     total_wage_type = WageType.objects.filter(trash=False)
#     province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first()
#     free_buying_live_weight_wage_type = total_wage_type.filter(en_name='live-buy', trash=False).first()
#     free_buying_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-buy', trash=False).first()
#     free_sell_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-sell', trash=False).first()
#     province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0
#     free_buying_live_weight_wage_type_amount = free_buying_live_weight_wage_type.amount if free_buying_live_weight_wage_type.status == True else 0
#     free_buying_carcesses_weight_wage_type_amount = free_buying_carcesses_weight_wage_type.amount if free_buying_carcesses_weight_wage_type.status == True else 0
#     free_sell_carcesses_weight_wage_type_amount = free_sell_carcesses_weight_wage_type.amount if free_sell_carcesses_weight_wage_type.status == True else 0
#
#     if date1:
#         province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False,
#                                                                     archive_wage=False, return_to_province=False,
#                                                                     kill_request__recive_date__date__gte=date1,
#                                                                     kill_request__recive_date__date__lte=date2,
#                                                                     state__in=('pending', 'accepted'),
#                                                                     first_car_allocated_quantity=0).order_by('id')
#
#         return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=True,
#                                                                            return_trash=True,
#                                                                            archive_wage=False, return_to_province=False,
#                                                                            kill_request__recive_date__date__gte=date1,
#                                                                            kill_request__recive_date__date__lte=date2,
#                                                                            state__in=('pending', 'accepted'),
#                                                                            first_car_allocated_quantity=0).order_by(
#             'id')
#         kill_house_requests = KillHouseRequest.objects.filter(
#             Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
#                 Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
#                 Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
#             kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2,
#             trash=False, calculate_status=True
#         )
#
#         return_kill_house_requests = KillHouseRequest.objects.filter(
#             Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
#                 Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
#                 Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
#             kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2,
#             trash=True, return_trash=True, calculate_status=True
#         )
#         kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
#             Q(kill_house=kill_house) | Q(exclusive_killer=kill_house),
#             archive_wage=False,
#             calculate_status=True, date__date__gte=date1, date__date__lte=date2,
#             trash=False)
#         kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
#             kill_house=kill_house,
#             archive_wage=False,
#             calculate_status=True, date__date__gte=date1, date__date__lte=date2,
#             trash=False)
#         slaughter_transactions = InternalTransaction.objects.filter(
#             kill_house=kill_house, status='completed', date__date__gte=date1, date__date__lte=date2,
#             trash=False)
#         difference_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, state='accepted',
#                                                                   create_date__date__gte=date1,
#                                                                   create_date__date__lte=date2)
#     else:
#
#         province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False,
#                                                                     archive_wage=False, return_to_province=False,
#                                                                     state__in=('pending', 'accepted'),
#                                                                     first_car_allocated_quantity=0).order_by('id')
#
#         return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=True,
#                                                                            return_trash=True,
#                                                                            archive_wage=False, return_to_province=False,
#                                                                            state__in=('pending', 'accepted'),
#                                                                            first_car_allocated_quantity=0).order_by(
#             'id')
#         kill_house_requests = KillHouseRequest.objects.filter(
#             Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
#                 Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
#                 Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
#             trash=False, calculate_status=True
#         )
#         return_kill_house_requests = KillHouseRequest.objects.filter(
#             Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
#                 Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
#                 Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
#             trash=True, return_trash=True, calculate_status=True
#         )
#         kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
#             Q(kill_house=kill_house) | Q(exclusive_killer=kill_house),
#             archive_wage=False,
#             calculate_status=True,
#             trash=False)
#         kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
#             kill_house=kill_house,
#             archive_wage=False,
#             calculate_status=True,
#             trash=False)
#         slaughter_transactions = InternalTransaction.objects.filter(
#             kill_house=kill_house, status='completed',
#             trash=False)
#         difference_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, state='accepted')
#
#     total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[
#                           'total'] or 0
#     total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0
#     total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
#     total_province_live_weight += \
#         difference_requests.aggregate(total=Sum('weight'))['total'] or 0
#     difference_requests_weight = \
#         difference_requests.aggregate(total=Sum('weight'))['total'] or 0
#     return_total_province_live_weight = return_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
#                                             'total'] or 0
#     return_total_province_live_weight += return_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
#                                              'total'] or 0
#
#     final_date = '2025-05-28'
#     total_out_selling_province_carcasses_weight = \
#         kill_house_free_sale_bar_info.filter(date__date__lte=final_date).aggregate(
#             total=Sum('real_weight_of_carcasses'))['total'] or 0
#     new_total_out_selling_province_carcasses_weight = \
#         kill_house_free_sale_bar_info.filter(date__date__gt=final_date,
#                                              quarantine_weight_of_carcasses__gt=0).aggregate(
#             total_weight=Sum(
#                 Case(
#                     When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
#                          then=F('real_weight_of_carcasses')),
#                     default=F('quarantine_weight_of_carcasses'),
#                     output_field=FloatField()
#                 )
#             )
#         )
#     new_out_selling = new_total_out_selling_province_carcasses_weight['total_weight'] or 0
#
#     total_out_selling_province_carcasses_weight += new_out_selling
#
#     if wage_counting_type == 'live':
#         total_province_carcasses_weight = total_province_live_weight
#         total_pure_province_carcasses_weight = total_province_carcasses_weight
#     else:
#         return_total_province_live_weight = int(return_total_province_live_weight * 0.75)
#         total_province_carcasses_weight = total_province_live_weight * 0.75
#         difference_requests_weight = difference_requests_weight * 0.75
#         total_out_carcasses_buying_for_pure_province_carcasses_weight = \
#             kill_house_free_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0
#         out_selling_out_carcasses_buying_difference = total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight if (
#                                                                                                                                                                              total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight) > 0 else 0
#         total_pure_province_carcasses_weight = total_province_carcasses_weight - out_selling_out_carcasses_buying_difference
#     total_out_live_buying_province_carcasses_weight = \
#         kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
#     real_total_out_live_buying_province_carcasses_weight = total_out_live_buying_province_carcasses_weight
#     if new_out_selling_count_wage:
#         if out_selling_ignore:
#             before_total_out_live_buying_province_carcasses_weight = \
#                 kill_house_free_bar_info.filter(create_date__date__lt=new_out_selling_count_wage_date,
#                                                 buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
#             after_total_out_live_buying_province_carcasses_weight = \
#                 kill_house_free_bar_info.filter(create_date__date__gte=new_out_selling_count_wage_date,
#                                                 buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
#             get_new_wage = get_new_wage_for_free_buying(kill_house_free_sale_bar_info)
#
#             before_new_out_selling = get_new_wage['before_new_out_selling']
#             after_new_out_selling = get_new_wage['after_new_out_selling']
#             max_amount = before_total_out_live_buying_province_carcasses_weight * 0.80
#             if max_amount <= before_new_out_selling:
#                 before_total_out_live_buying_province_carcasses_weight -= max_amount
#             else:
#                 before_total_out_live_buying_province_carcasses_weight -= before_new_out_selling
#
#             if after_total_out_live_buying_province_carcasses_weight > after_new_out_selling:
#                 extra_company_amount = int(after_new_out_selling * extra_company_amount)
#                 after_total_out_live_buying_province_carcasses_weight -= after_new_out_selling
#
#             else:
#                 extra_company_amount = int(after_total_out_live_buying_province_carcasses_weight * extra_company_amount)
#
#                 after_total_out_live_buying_province_carcasses_weight = 0
#
#             total_out_live_buying_province_carcasses_weight = before_total_out_live_buying_province_carcasses_weight + after_total_out_live_buying_province_carcasses_weight
#
#     else:
#         if out_selling_ignore:
#             max_amount = total_out_live_buying_province_carcasses_weight * 0.80
#             if max_amount <= new_out_selling:
#                 total_out_live_buying_province_carcasses_weight -= max_amount
#             else:
#                 total_out_live_buying_province_carcasses_weight -= new_out_selling
#
#         # else:
#         #     total_out_live_buying_province_carcasses_weight -= total_out_selling_province_quarantine_carcasses_weight
#     total_out_carcasses_buying_province_carcasses_weight = \
#         kill_house_free_bar_info.filter(buy_type='carcass').aggregate(total=Sum('weight_of_carcasses'))['total'] or 0
#
#     total_pure_province_carcasses_price = total_pure_province_carcasses_weight * province_live_wage_type_amount
#     difference_requests_price = difference_requests_weight * province_live_wage_type_amount
#     total_return_pure_province_carcasses_price = return_total_province_live_weight * province_live_wage_type_amount
#     total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_wage_type_amount
#     if new_out_selling_count_wage:
#         total_out_live_buying_province_carcasses_price = int(
#             (before_total_out_live_buying_province_carcasses_weight * before_out_buying_count_wage_amount) + (
#                     after_total_out_live_buying_province_carcasses_weight * free_buying_live_weight_wage_type_amount))
#     else:
#         total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_wage_type_amount
#
#     total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_wage_type_amount
#     total_price = total_pure_province_carcasses_price + total_out_selling_province_carcasses_price + total_out_live_buying_province_carcasses_price + total_out_carcasses_buying_province_carcasses_price + extra_company_amount + total_return_pure_province_carcasses_price
#
#     return {
#         "total_province_live_weight": total_province_live_weight,
#         "total_province_carcasses_weight": total_province_carcasses_weight,
#         "total_out_selling_province_carcasses_weight": total_out_selling_province_carcasses_weight,
#         "total_pure_province_carcasses_weight": total_pure_province_carcasses_weight,
#         "total_pure_province_carcasses_price": total_pure_province_carcasses_price,
#         "total_out_selling_province_carcasses_price": total_out_selling_province_carcasses_price,
#         "total_out_carcasses_buying_province_carcasses_weight": total_out_carcasses_buying_province_carcasses_weight,
#         "total_out_carcasses_buying_province_carcasses_price": total_out_carcasses_buying_province_carcasses_price,
#         "total_out_live_buying_province_carcasses_weight": real_total_out_live_buying_province_carcasses_weight,
#         "total_out_live_buying_province_carcasses_price": total_out_live_buying_province_carcasses_price,
#         "total_paid_wage": total_paid_wage,
#         "total_price": total_price,
#         "province_live_wage_amount": province_live_wage_type_amount,
#         "free_buying_live_weight_amount": free_buying_live_weight_wage_type_amount,
#         "free_buying_carcesses_weight_amount": free_buying_carcesses_weight_wage_type_amount,
#         "free_sell_carcesses_weight_amount": free_sell_carcesses_weight_wage_type_amount,
#         "extra_company_amount": extra_company_amount,
#         "before_total_out_live_buying_province_carcasses_weight": before_total_out_live_buying_province_carcasses_weight,
#         "after_total_out_live_buying_province_carcasses_weight": after_total_out_live_buying_province_carcasses_weight,
#         "before_new_out_selling": before_new_out_selling,
#         "after_new_out_selling": after_new_out_selling,
#         "return_total_province_live_weight": return_total_province_live_weight,
#         "total_return_pure_province_carcasses_price": total_return_pure_province_carcasses_price,
#         "difference_requests_weight": difference_requests_weight,
#         "difference_requests_price": difference_requests_price,
#
#     }


def get_finance_info(kill_house, date1=None, date2=None):
    before_total_out_live_buying_province_carcasses_weight = 0
    after_total_out_live_buying_province_carcasses_weight = 0
    before_new_out_selling = 0
    after_new_out_selling = 0
    extra_company_amount = 0
    total_wage_type = WageType.objects.filter(trash=False)
    province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first()
    free_buying_live_weight_wage_type = total_wage_type.filter(en_name='live-buy', trash=False).first()
    free_buying_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-buy', trash=False).first()
    free_sell_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-sell', trash=False).first()
    province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0
    free_buying_live_weight_wage_type_amount = free_buying_live_weight_wage_type.amount if free_buying_live_weight_wage_type.status == True else 0
    free_buying_carcesses_weight_wage_type_amount = free_buying_carcesses_weight_wage_type.amount if free_buying_carcesses_weight_wage_type.status == True else 0
    free_sell_carcesses_weight_wage_type_amount = free_sell_carcesses_weight_wage_type.amount if free_sell_carcesses_weight_wage_type.status == True else 0

    if date1:
        province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False,
                                                                    archive_wage=False, return_to_province=False,
                                                                    kill_request__recive_date__date__gte=date1,
                                                                    kill_request__recive_date__date__lte=date2,
                                                                    state__in=('pending', 'accepted'),
                                                                    first_car_allocated_quantity=0).order_by('id')

        return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=True,
                                                                           return_trash=True,
                                                                           archive_wage=False, return_to_province=False,
                                                                           kill_request__recive_date__date__gte=date1,
                                                                           kill_request__recive_date__date__lte=date2,
                                                                           state__in=('pending', 'accepted'),
                                                                           first_car_allocated_quantity=0).order_by(
            'id')
        if kill_house.killer and kill_house.type == 'public':
            kill_house_requests = KillHouseRequest.objects.filter(
                killhouse_user=kill_house, archive_wage=False,
                kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2,
                trash=False, calculate_status=True
            )

            return_kill_house_requests = KillHouseRequest.objects.filter(
                killhouse_user=kill_house, archive_wage=False,
                kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2,
                trash=True, return_trash=True, calculate_status=True
            )
        else:
            kill_house_requests = KillHouseRequest.objects.filter(
                Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                    Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                    Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
                kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2,
                trash=False, calculate_status=True
            )

            return_kill_house_requests = KillHouseRequest.objects.filter(
                Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                    Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                    Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
                kill_request__recive_date__date__gte=date1, kill_request__recive_date__date__lte=date2,
                trash=True, return_trash=True, calculate_status=True
            )
        kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
            Q(kill_house=kill_house) | Q(exclusive_killer=kill_house),
            archive_wage=False,
            calculate_status=True, date__date__gte=date1, date__date__lte=date2,
            trash=False)
        kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
            kill_house=kill_house,
            archive_wage=False,
            calculate_status=True, date__date__gte=date1, date__date__lte=date2,
            trash=False)
        slaughter_transactions = InternalTransaction.objects.filter(
            kill_house=kill_house, status='completed', date__date__gte=date1, date__date__lte=date2,
            trash=False)
        difference_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, state='accepted',
                                                                  create_date__date__gte=date1,
                                                                  create_date__date__lte=date2)
    else:

        province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False,
                                                                    archive_wage=False, return_to_province=False,
                                                                    state__in=('pending', 'accepted'),
                                                                    first_car_allocated_quantity=0).order_by('id')

        return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=True,
                                                                           return_trash=True,
                                                                           archive_wage=False, return_to_province=False,
                                                                           state__in=('pending', 'accepted'),
                                                                           first_car_allocated_quantity=0).order_by(
            'id')

        if kill_house.killer and kill_house.type == 'public':

            kill_house_requests = KillHouseRequest.objects.filter(
                killhouse_user=kill_house, archive_wage=False,
                trash=False, calculate_status=True
            )
            return_kill_house_requests = KillHouseRequest.objects.filter(
                killhouse_user=kill_house, archive_wage=False,
                trash=True, return_trash=True, calculate_status=True
            )
        else:
            kill_house_requests = KillHouseRequest.objects.filter(
                Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                    Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                    Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
                trash=False, calculate_status=True
            )
            return_kill_house_requests = KillHouseRequest.objects.filter(
                Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                    Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                    Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
                trash=True, return_trash=True, calculate_status=True
            )
        kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
            Q(kill_house=kill_house) | Q(exclusive_killer=kill_house),
            archive_wage=False,
            calculate_status=True,
            trash=False)
        kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
            kill_house=kill_house,
            archive_wage=False,
            calculate_status=True,
            trash=False)
        slaughter_transactions = InternalTransaction.objects.filter(
            kill_house=kill_house, status='completed',
            trash=False)
        difference_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, state='accepted')

    total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[
                          'total'] or 0
    total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0
    total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
    total_province_live_weight += \
        difference_requests.aggregate(total=Sum('weight'))['total'] or 0
    difference_requests_weight = \
        difference_requests.aggregate(total=Sum('weight'))['total'] or 0
    return_total_province_live_weight = return_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
                                            'total'] or 0
    return_total_province_live_weight += return_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
                                             'total'] or 0

    final_date = '2025-05-28'
    total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__lte=final_date).aggregate(
            total=Sum('real_weight_of_carcasses'))['total'] or 0
    new_total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__gt=final_date,
                                             quarantine_weight_of_carcasses__gt=0).aggregate(
            total_weight=Sum(
                Case(
                    When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
                         then=F('real_weight_of_carcasses')),
                    default=F('quarantine_weight_of_carcasses'),
                    output_field=FloatField()
                )
            )
        )
    new_out_selling = new_total_out_selling_province_carcasses_weight['total_weight'] or 0

    total_out_selling_province_carcasses_weight += new_out_selling

    if wage_counting_type == 'live':
        total_province_carcasses_weight = total_province_live_weight
        total_pure_province_carcasses_weight = total_province_carcasses_weight
    else:
        return_total_province_live_weight = int(return_total_province_live_weight * 0.75)
        total_province_carcasses_weight = total_province_live_weight * 0.75
        difference_requests_weight = difference_requests_weight * 0.75
        total_out_carcasses_buying_for_pure_province_carcasses_weight = \
            kill_house_free_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0
        out_selling_out_carcasses_buying_difference = total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight if (
                                                                                                                                                                             total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight) > 0 else 0
        total_pure_province_carcasses_weight = total_province_carcasses_weight - out_selling_out_carcasses_buying_difference
    total_out_live_buying_province_carcasses_weight = \
        kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
    real_total_out_live_buying_province_carcasses_weight = total_out_live_buying_province_carcasses_weight
    if new_out_selling_count_wage:
        if out_selling_ignore:
            before_total_out_live_buying_province_carcasses_weight = \
                kill_house_free_bar_info.filter(create_date__date__lt=new_out_selling_count_wage_date,
                                                buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
            after_total_out_live_buying_province_carcasses_weight = \
                kill_house_free_bar_info.filter(create_date__date__gte=new_out_selling_count_wage_date,
                                                buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
            get_new_wage = get_new_wage_for_free_buying(kill_house_free_sale_bar_info)

            before_new_out_selling = get_new_wage['before_new_out_selling']
            after_new_out_selling = get_new_wage['after_new_out_selling']
            max_amount = before_total_out_live_buying_province_carcasses_weight * 0.80
            if max_amount <= before_new_out_selling:
                before_total_out_live_buying_province_carcasses_weight -= max_amount
            else:
                before_total_out_live_buying_province_carcasses_weight -= before_new_out_selling

            if after_total_out_live_buying_province_carcasses_weight > after_new_out_selling:
                extra_company_amount = int(after_new_out_selling * extra_company_amount)
                after_total_out_live_buying_province_carcasses_weight -= after_new_out_selling

            else:
                extra_company_amount = int(after_total_out_live_buying_province_carcasses_weight * extra_company_amount)

                after_total_out_live_buying_province_carcasses_weight = 0

            total_out_live_buying_province_carcasses_weight = before_total_out_live_buying_province_carcasses_weight + after_total_out_live_buying_province_carcasses_weight

    else:
        if out_selling_ignore:
            max_amount = total_out_live_buying_province_carcasses_weight * 0.80
            if max_amount <= new_out_selling:
                total_out_live_buying_province_carcasses_weight -= max_amount
            else:
                total_out_live_buying_province_carcasses_weight -= new_out_selling

        # else:
        #     total_out_live_buying_province_carcasses_weight -= total_out_selling_province_quarantine_carcasses_weight
    total_out_carcasses_buying_province_carcasses_weight = \
        kill_house_free_bar_info.filter(buy_type='carcass').aggregate(total=Sum('weight_of_carcasses'))['total'] or 0

    total_pure_province_carcasses_price = total_pure_province_carcasses_weight * province_live_wage_type_amount
    difference_requests_price = difference_requests_weight * province_live_wage_type_amount
    total_return_pure_province_carcasses_price = return_total_province_live_weight * province_live_wage_type_amount
    total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_wage_type_amount
    if new_out_selling_count_wage:
        total_out_live_buying_province_carcasses_price = int(
            (before_total_out_live_buying_province_carcasses_weight * before_out_buying_count_wage_amount) + (
                    after_total_out_live_buying_province_carcasses_weight * free_buying_live_weight_wage_type_amount))
    else:
        total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_wage_type_amount

    total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_wage_type_amount
    total_price = total_pure_province_carcasses_price + total_out_selling_province_carcasses_price + total_out_live_buying_province_carcasses_price + total_out_carcasses_buying_province_carcasses_price + extra_company_amount + total_return_pure_province_carcasses_price

    return {
        "total_province_live_weight": total_province_live_weight,
        "total_province_carcasses_weight": total_province_carcasses_weight,
        "total_out_selling_province_carcasses_weight": total_out_selling_province_carcasses_weight,
        "total_pure_province_carcasses_weight": total_pure_province_carcasses_weight,
        "total_pure_province_carcasses_price": total_pure_province_carcasses_price,
        "total_out_selling_province_carcasses_price": total_out_selling_province_carcasses_price,
        "total_out_carcasses_buying_province_carcasses_weight": total_out_carcasses_buying_province_carcasses_weight,
        "total_out_carcasses_buying_province_carcasses_price": total_out_carcasses_buying_province_carcasses_price,
        "total_out_live_buying_province_carcasses_weight": real_total_out_live_buying_province_carcasses_weight,
        "total_out_live_buying_province_carcasses_price": total_out_live_buying_province_carcasses_price,
        "total_paid_wage": total_paid_wage,
        "total_price": total_price,
        "province_live_wage_amount": province_live_wage_type_amount,
        "free_buying_live_weight_amount": free_buying_live_weight_wage_type_amount,
        "free_buying_carcesses_weight_amount": free_buying_carcesses_weight_wage_type_amount,
        "free_sell_carcesses_weight_amount": free_sell_carcesses_weight_wage_type_amount,
        "extra_company_amount": extra_company_amount,
        "before_total_out_live_buying_province_carcasses_weight": before_total_out_live_buying_province_carcasses_weight,
        "after_total_out_live_buying_province_carcasses_weight": after_total_out_live_buying_province_carcasses_weight,
        "before_new_out_selling": before_new_out_selling,
        "after_new_out_selling": after_new_out_selling,
        "return_total_province_live_weight": return_total_province_live_weight,
        "total_return_pure_province_carcasses_price": total_return_pure_province_carcasses_price,
        "difference_requests_weight": difference_requests_weight,
        "difference_requests_price": difference_requests_price,

    }


def get_kill_houses_out_buying_info(kill_houses, date1=None, date2=None):
    final_out_live_buying_province_carcasses_weight = 0
    before_total_out_live_buying_province_carcasses_weight = 0
    after_total_out_live_buying_province_carcasses_weight = 0
    before_new_out_selling = 0
    after_new_out_selling = 0
    extra_company_amount = 0
    total_wage_type = WageType.objects.filter(trash=False)
    province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first()
    free_buying_live_weight_wage_type = total_wage_type.filter(en_name='live-buy', trash=False).first()
    free_buying_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-buy', trash=False).first()
    free_sell_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-sell', trash=False).first()
    province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0
    free_buying_live_weight_wage_type_amount = free_buying_live_weight_wage_type.amount if free_buying_live_weight_wage_type.status == True else 0
    free_buying_carcesses_weight_wage_type_amount = free_buying_carcesses_weight_wage_type.amount if free_buying_carcesses_weight_wage_type.status == True else 0
    free_sell_carcesses_weight_wage_type_amount = free_sell_carcesses_weight_wage_type.amount if free_sell_carcesses_weight_wage_type.status == True else 0
    for kill_house in kill_houses:
        if date1:
            kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
                Q(kill_house=kill_house) | Q(exclusive_killer=kill_house),
                archive_wage=False,
                calculate_status=True, date__date__gte=date1, date__date__lte=date2,
                trash=False)
            kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
                kill_house=kill_house,
                archive_wage=False,
                calculate_status=True, date__date__gte=date1, date__date__lte=date2,
                trash=False)
        else:

            kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
                Q(kill_house=kill_house) | Q(exclusive_killer=kill_house),
                archive_wage=False,
                calculate_status=True,
                trash=False)
            kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
                kill_house=kill_house,
                archive_wage=False,
                calculate_status=True,
                trash=False)

        final_date = '2025-05-28'
        total_out_selling_province_carcasses_weight = \
            kill_house_free_sale_bar_info.filter(date__date__lte=final_date).aggregate(
                total=Sum('real_weight_of_carcasses'))['total'] or 0
        new_total_out_selling_province_carcasses_weight = \
            kill_house_free_sale_bar_info.filter(date__date__gt=final_date,
                                                 quarantine_weight_of_carcasses__gt=0).aggregate(
                total_weight=Sum(
                    Case(
                        When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
                             then=F('real_weight_of_carcasses')),
                        default=F('quarantine_weight_of_carcasses'),
                        output_field=FloatField()
                    )
                )
            )
        new_out_selling = new_total_out_selling_province_carcasses_weight['total_weight'] or 0

        total_out_selling_province_carcasses_weight += new_out_selling

        total_out_live_buying_province_carcasses_weight = \
            kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
        if new_out_selling_count_wage:
            if out_selling_ignore:
                before_total_out_live_buying_province_carcasses_weight = \
                    kill_house_free_bar_info.filter(create_date__date__lt=new_out_selling_count_wage_date,
                                                    buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
                after_total_out_live_buying_province_carcasses_weight = \
                    kill_house_free_bar_info.filter(create_date__date__gte=new_out_selling_count_wage_date,
                                                    buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
                get_new_wage = get_new_wage_for_free_buying(kill_house_free_sale_bar_info)

                before_new_out_selling = get_new_wage['before_new_out_selling']
                after_new_out_selling = get_new_wage['after_new_out_selling']
                max_amount = before_total_out_live_buying_province_carcasses_weight * 0.80
                if max_amount <= before_new_out_selling:
                    before_total_out_live_buying_province_carcasses_weight -= max_amount
                else:
                    before_total_out_live_buying_province_carcasses_weight -= before_new_out_selling

                if after_total_out_live_buying_province_carcasses_weight > after_new_out_selling:
                    extra_company_amount = int(after_new_out_selling * extra_company_amount)
                    after_total_out_live_buying_province_carcasses_weight -= after_new_out_selling

                else:
                    extra_company_amount = int(after_total_out_live_buying_province_carcasses_weight * extra_company_amount)

                    after_total_out_live_buying_province_carcasses_weight = 0

                total_out_live_buying_province_carcasses_weight = before_total_out_live_buying_province_carcasses_weight + after_total_out_live_buying_province_carcasses_weight

        else:
            if out_selling_ignore:
                max_amount = total_out_live_buying_province_carcasses_weight * 0.80

                if max_amount <= new_out_selling:
                    total_out_live_buying_province_carcasses_weight -= max_amount
                else:
                    total_out_live_buying_province_carcasses_weight -= new_out_selling
        final_out_live_buying_province_carcasses_weight +=total_out_live_buying_province_carcasses_weight
    print(final_out_live_buying_province_carcasses_weight)
    return final_out_live_buying_province_carcasses_weight
def get_total_wage_info(kill_house):
    total_wage = 0
    total_paid_wage = 0
    off = 0
    total_unpaid_wage = 0
    province_kill_requests_total_wage = 0
    province_kill_requests_total_weight = 0
    free_bars_live_total_wage = 0
    free_bars_live_total_weight = 0
    free_bars_carcases_total_wage = 0
    free_bars_carcases_total_weight = 0
    free_bars_out_province_carcases_total_wage = 0
    free_bars_out_province_carcases_total_weight = 0
    total_province_live_weight = 0
    total_province_carcasses_weight = 0
    province_live_wage_amount = 0
    free_buying_live_weight_amount = 0
    free_buying_carcesses_weight_amount = 0
    free_sell_carcesses_weight_amount = 0
    return_total_province_live_weight = 0
    total_return_pure_province_carcasses_price = 0
    total_pure_province_carcasses_price = 0
    return_total_pure_province_carcasses_price = 0
    total_out_selling_province_carcasses_price = 0
    difference_requests_price = 0

    before_total_out_live_buying_province_carcasses_price = 0
    total_out_live_buying_province_carcasses_price = 0
    total_out_carcasses_buying_province_carcasses_price = 0

    guilds_difference_requests_price = 0
    other_difference_requests_price = 0
    guild_return_province_kill_request_wage = 0
    other_return_province_kill_request_wage = 0

    before_total_out_live_buying_province_carcasses_price = 0
    total_wage_type = WageType.objects.filter(trash=False)
    free_buying_live_weight_wage_type = total_wage_type.filter(en_name='live-buy', trash=False).first()
    free_buying_live_weight_wage_type_amount = free_buying_live_weight_wage_type.amount if free_buying_live_weight_wage_type.status == True else 0

    finance_info = get_finance_info(kill_house)
    if kill_house.killer and kill_house.type == 'public':

        slaughter_transactions = InternalTransaction.objects.filter(
            kill_house=kill_house, parent_kill_house=kill_house, status='completed',
            trash=False)
    else:
        slaughter_transactions = InternalTransaction.objects.filter(
            Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), status='completed',
            trash=False)


    total_paid_wage += slaughter_transactions.aggregate(total=Sum('amount'))[
                           'total'] or 0

    total_pure_province_carcasses_price = finance_info['total_pure_province_carcasses_price']
    return_total_pure_province_carcasses_price = finance_info['total_return_pure_province_carcasses_price']
    total_out_selling_province_carcasses_price = finance_info['total_out_selling_province_carcasses_price']
    difference_requests_price = finance_info['difference_requests_price']

    if new_out_selling_count_wage:
        total_out_live_buying_province_carcasses_price = int(
            (finance_info[
                 'before_total_out_live_buying_province_carcasses_weight'] * before_out_buying_count_wage_amount) + (
                    finance_info[
                        'after_total_out_live_buying_province_carcasses_weight'] * free_buying_live_weight_wage_type_amount))

        before_total_out_live_buying_province_carcasses_price = finance_info[
                                                                    'before_total_out_live_buying_province_carcasses_weight'] * before_out_buying_count_wage_amount
    else:
        total_out_live_buying_province_carcasses_price = finance_info[
            'total_out_live_buying_province_carcasses_price']
    total_out_carcasses_buying_province_carcasses_price = finance_info[
        'total_out_carcasses_buying_province_carcasses_price']

    percentages_wage_type = PercentageOfWageType.objects.filter(trash=False)
    union_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='union').first().percent / 100
    company_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='company').first().percent / 100
    guilds_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='guilds').first().percent / 100
    other_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100

    union_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                  share_type__en_name='union').first().percent / 100
    union_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                       share_type__en_name='union').first().percent / 100
    company_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                    share_type__en_name='company').first().percent / 100
    company_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                         share_type__en_name='company').first().percent / 100
    guilds_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                   share_type__en_name='guilds').first().percent / 100
    guilds_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                        share_type__en_name='guilds').first().percent / 100
    other_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                  share_type__en_name='other').first().percent / 100
    other_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                       share_type__en_name='other').first().percent / 100

    union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                     share_type__en_name='union').first().percent / 100
    company_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                       share_type__en_name='company').first().percent / 100
    guilds_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                      share_type__en_name='guilds').first().percent / 100
    other_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                     share_type__en_name='other').first().percent / 100

    guilds_difference_requests_price = difference_requests_price * guilds_province_kill_request_percent
    other_difference_requests_price = difference_requests_price * other_province_kill_request_percent
    guild_return_province_kill_request_wage = return_total_pure_province_carcasses_price * guilds_province_kill_request_percent
    other_return_province_kill_request_wage = return_total_pure_province_carcasses_price * other_province_kill_request_percent

    union_province_kill_request_wage = total_pure_province_carcasses_price * union_province_kill_request_percent
    return_union_province_kill_request_wage = return_total_pure_province_carcasses_price * union_province_kill_request_percent
    union_free_buying_live_wage = (
                                          total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * union_free_buying_live_percent
    union_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * union_free_buying_carcasses_percent
    union_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * union_free_sell_carcasses_percent
    union_total_wage = union_province_kill_request_wage + union_free_buying_live_wage + union_free_buying_carcasses_wage + union_free_sell_carcasses_wage + return_union_province_kill_request_wage
    union_total_paid_wage = slaughter_transactions.aggregate(total=Sum('union_share'))['total'] or 0
    union_total_unpaid_wage = union_total_wage - union_total_paid_wage
    company_province_kill_request_wage = (
                                                 total_pure_province_carcasses_price * company_province_kill_request_percent) + (
                                                 guilds_difference_requests_price + other_difference_requests_price)
    return_company_province_kill_request_wage = (
                                                        return_total_pure_province_carcasses_price * company_province_kill_request_percent) + (
                                                        guild_return_province_kill_request_wage + other_return_province_kill_request_wage)
    company_free_buying_live_wage = ((
                                             total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * company_free_buying_live_percent) + before_total_out_live_buying_province_carcasses_price
    company_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * company_free_buying_carcasses_percent
    company_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * company_free_sell_carcasses_percent
    company_total_wage = company_province_kill_request_wage + company_free_buying_live_wage + company_free_buying_carcasses_wage + company_free_sell_carcasses_wage + return_company_province_kill_request_wage
    company_total_paid_wage = slaughter_transactions.aggregate(total=Sum('company_share'))['total'] or 0
    company_total_unpaid_wage = company_total_wage - company_total_paid_wage

    guilds_province_kill_request_wage = (
                                                total_pure_province_carcasses_price * guilds_province_kill_request_percent) - guilds_difference_requests_price
    return_guilds_province_kill_request_wage = 0
    guilds_free_buying_live_wage = (
                                           total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * guilds_free_buying_live_percent
    guilds_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * guilds_free_buying_carcasses_percent
    guilds_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * guilds_free_sell_carcasses_percent
    guilds_total_wage = guilds_province_kill_request_wage + guilds_free_buying_live_wage + guilds_free_buying_carcasses_wage + guilds_free_sell_carcasses_wage
    guilds_total_paid_wage = slaughter_transactions.aggregate(total=Sum('guilds_share'))['total'] or 0
    guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage

    other_province_kill_request_wage = (
                                               total_pure_province_carcasses_price * other_province_kill_request_percent) - other_difference_requests_price
    return_other_province_kill_request_wage = 0
    other_free_buying_live_wage = (
                                          total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * other_free_buying_live_percent
    other_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * other_free_buying_carcasses_percent
    other_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * other_free_sell_carcasses_percent
    other_total_wage = other_province_kill_request_wage + other_free_buying_live_wage + other_free_buying_carcasses_wage + other_free_sell_carcasses_wage
    other_total_paid_wage = slaughter_transactions.aggregate(total=Sum('other_share'))['total'] or 0
    other_total_unpaid_wage = other_total_wage - other_total_paid_wage

    result = {
        "wage_counting_type": wage_counting_type,
        "total_wage": finance_info['total_price'],
        "total_paid_wage": total_paid_wage,
        "off": kill_house.off,
        "total_unpaid_wage": finance_info['total_price'] - (total_paid_wage + kill_house.off),
        "province_kill_requests_total_wage": finance_info['total_pure_province_carcasses_price'],
        "province_kill_requests_total_weight": finance_info['total_pure_province_carcasses_weight'],
        "free_bars_live_total_wage": finance_info['total_out_live_buying_province_carcasses_price'],
        "free_bars_live_total_weight": finance_info['total_out_live_buying_province_carcasses_weight'],
        "free_bars_carcases_total_wage": finance_info['total_out_carcasses_buying_province_carcasses_price'],
        "free_bars_carcases_total_weight": finance_info['total_out_carcasses_buying_province_carcasses_weight'],
        "free_bars_out_province_carcases_total_wage": finance_info['total_out_selling_province_carcasses_price'],
        "free_bars_out_province_carcases_total_weight": finance_info['total_out_selling_province_carcasses_weight'],
        "total_province_live_weight": finance_info['total_province_live_weight'],
        "total_province_carcasses_weight": finance_info['total_province_carcasses_weight'],
        "province_live_wage_amount": finance_info['province_live_wage_amount'],
        "free_buying_live_weight_amount": finance_info['free_buying_live_weight_amount'],
        "free_buying_carcesses_weight_amount": finance_info['free_buying_carcesses_weight_amount'],
        "free_sell_carcesses_weight_amount": finance_info['free_sell_carcesses_weight_amount'],
        "extra_company_amount":finance_info['extra_company_amount'],
        "return_total_province_live_weight": finance_info['return_total_province_live_weight'],
        "total_return_pure_province_carcasses_price": finance_info['total_return_pure_province_carcasses_price'],
        "union_province_kill_request_wage": union_province_kill_request_wage,
        "return_union_province_kill_request_wage": return_union_province_kill_request_wage,
        "union_free_buying_live_wage": union_free_buying_live_wage,
        "union_free_buying_carcasses_wage": union_free_buying_carcasses_wage,
        "union_free_sell_carcasses_wage": union_free_sell_carcasses_wage,
        "union_total_wage": union_total_wage,
        "union_total_paid_wage": union_total_paid_wage,
        "union_total_unpaid_wage": union_total_unpaid_wage,
        "company_province_kill_request_wage": company_province_kill_request_wage,
        "return_company_province_kill_request_wage": return_company_province_kill_request_wage,
        "company_free_buying_live_wage": company_free_buying_live_wage,
        "company_free_buying_carcasses_wage": company_free_buying_carcasses_wage,
        "company_free_sell_carcasses_wage": company_free_sell_carcasses_wage,
        "company_total_wage": company_total_wage,
        "company_total_paid_wage": company_total_paid_wage,
        "company_total_unpaid_wage": company_total_unpaid_wage,
        "guilds_province_kill_request_wage": guilds_province_kill_request_wage,
        "return_guilds_province_kill_request_wage": return_guilds_province_kill_request_wage,
        "guilds_free_buying_live_wage": guilds_free_buying_live_wage,
        "guilds_free_buying_carcasses_wage": guilds_free_buying_carcasses_wage,
        "guilds_free_sell_carcasses_wage": guilds_free_sell_carcasses_wage,
        "guilds_total_wage": guilds_total_wage,
        "guilds_total_paid_wage": guilds_total_paid_wage,
        "guilds_total_unpaid_wage": guilds_total_unpaid_wage,
        "other_province_kill_request_wage": other_province_kill_request_wage,
        "return_other_province_kill_request_wage": return_other_province_kill_request_wage,
        "other_free_buying_live_wage": other_free_buying_live_wage,
        "other_free_buying_carcasses_wage": other_free_buying_carcasses_wage,
        "other_free_sell_carcasses_wage": other_free_sell_carcasses_wage,
        "other_total_wage": other_total_wage,
        "other_total_paid_wage": other_total_paid_wage,
        "other_total_unpaid_wage": other_total_unpaid_wage,
    }

    return result

def get_kill_house_finance_info(kill_house, date1=None, date2=None):
    before_total_out_live_buying_province_carcasses_weight = 0
    after_total_out_live_buying_province_carcasses_weight = 0
    before_new_out_selling = 0
    after_new_out_selling = 0
    extra_company_amount = 0
    total_wage_type = WageType.objects.filter(trash=False)
    province_live_wage_type = total_wage_type.filter(en_name='province-kill-request', trash=False).first()
    free_buying_live_weight_wage_type = total_wage_type.filter(en_name='live-buy', trash=False).first()
    free_buying_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-buy', trash=False).first()
    free_sell_carcesses_weight_wage_type = total_wage_type.filter(en_name='carcasse-sell', trash=False).first()
    province_live_wage_type_amount = province_live_wage_type.amount if province_live_wage_type.status == True else 0
    free_buying_live_weight_wage_type_amount = free_buying_live_weight_wage_type.amount if free_buying_live_weight_wage_type.status == True else 0
    free_buying_carcesses_weight_wage_type_amount = free_buying_carcesses_weight_wage_type.amount if free_buying_carcesses_weight_wage_type.status == True else 0
    free_sell_carcesses_weight_wage_type_amount = free_sell_carcesses_weight_wage_type.amount if free_sell_carcesses_weight_wage_type.status == True else 0

    if date1:

        province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False,
                                                                    archive_wage=False, return_to_province=False,
                                                                    state__in=('pending', 'accepted'),
                                                                    kill_request__recive_date__date__gte=date1,
                                                                    kill_request__recive_date__date__lte=date2,
                                                                    first_car_allocated_quantity=0).order_by('id')
        return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=True,
                                                                           return_trash=True,
                                                                           archive_wage=False, return_to_province=False,
                                                                           state__in=('pending', 'accepted'),
                                                                           kill_request__recive_date__date__gte=date1,
                                                                           kill_request__recive_date__date__lte=date2,
                                                                           first_car_allocated_quantity=0).order_by(
            'id')
        kill_house_requests = KillHouseRequest.objects.filter(
            Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
            trash=False, calculate_status=True, kill_request__recive_date__date__gte=date1,
            kill_request__recive_date__date__lte=date2,
        )
        kill_house_requests = kill_house_requests.filter(
            Q(killhouse_user=kill_house, killer__isnull=True) | Q(killhouse_user=kill_house, killer=kill_house) | Q(
                killer=kill_house))

        return_kill_house_requests = KillHouseRequest.objects.filter(
            Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
            trash=True, return_trash=True, calculate_status=True, kill_request__recive_date__date__gte=date1,
            kill_request__recive_date__date__lte=date2,
        )
        return_kill_house_requests = return_kill_house_requests.filter(
            Q(killhouse_user=kill_house, killer__isnull=True) | Q(killhouse_user=kill_house, killer=kill_house) | Q(
                killer=kill_house))
        kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
            Q(kill_house=kill_house, exclusive_killer__isnull=True) | Q(exclusive_killer=kill_house),
            archive_wage=False,
            calculate_status=True, create_date__date__gte=date1, create_date__date__lte=date2,
            trash=False)
        kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
            kill_house=kill_house,
            archive_wage=False,
            calculate_status=True, date__date__gte=date1, date__date__lte=date2,
            trash=False)
        slaughter_transactions = InternalTransaction.objects.filter(
            kill_house=kill_house, status='completed', date__date__gte=date1, date__date__lte=date2,
            trash=False)
        difference_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, state='accepted',
                                                                  create_date__date__gte=date1,
                                                                  create_date__date__lte=date2, )


    else:

        province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=False,
                                                                    archive_wage=False, return_to_province=False,
                                                                    state__in=('pending', 'accepted'),
                                                                    first_car_allocated_quantity=0).order_by('id')
        return_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user=kill_house, trash=True,
                                                                           return_trash=True,
                                                                           archive_wage=False, return_to_province=False,
                                                                           state__in=('pending', 'accepted'),
                                                                           first_car_allocated_quantity=0).order_by(
            'id')
        kill_house_requests = KillHouseRequest.objects.filter(
            Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
            trash=False, calculate_status=True
        )
        kill_house_requests = kill_house_requests.filter(
            Q(killhouse_user=kill_house, killer__isnull=True) | Q(killhouse_user=kill_house, killer=kill_house) | Q(
                killer=kill_house))

        return_kill_house_requests = KillHouseRequest.objects.filter(
            Q(Q(killhouse_user=kill_house) & Q(killer=kill_house)) | Q(
                Q(killhouse_user=kill_house) & Q(killer__isnull=True)) | Q(
                Q(killhouse_user=kill_house) | Q(killer=kill_house)), archive_wage=False,
            trash=True, return_trash=True, calculate_status=True
        )
        return_kill_house_requests = return_kill_house_requests.filter(
            Q(killhouse_user=kill_house, killer__isnull=True) | Q(killhouse_user=kill_house, killer=kill_house) | Q(
                killer=kill_house))
        kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(
            Q(kill_house=kill_house, exclusive_killer__isnull=True) | Q(exclusive_killer=kill_house),
            archive_wage=False,
            calculate_status=True,
            trash=False)
        kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
            kill_house=kill_house,
            archive_wage=False,
            calculate_status=True,
            trash=False)
        slaughter_transactions = InternalTransaction.objects.filter(
            kill_house=kill_house, status='completed',
            trash=False)
        difference_requests = BarDifferenceRequest.objects.filter(kill_house=kill_house, trash=False, state='accepted')

    total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[
                          'total'] or 0

    total_province_live_weight = province_kill_requests.aggregate(total=Sum('total_killed_weight'))['total'] or 0
    total_province_live_weight += kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
    # total_out_selling_province_carcasses_weight = \
    #     kill_house_free_sale_bar_info.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
    # sum_quarantine_carcasses_weight = \
    #     kill_house_free_sale_bar_info.filter(quarantine_weight_of_carcasses__gt=0).aggregate(
    #         total_weight=Sum(
    #             Case(
    #                 When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
    #                      then=F('real_weight_of_carcasses')),
    #                 default=F('quarantine_weight_of_carcasses'),
    #                 output_field=FloatField()
    #             )
    #         )
    #     )
    # total_out_selling_province_quarantine_carcasses_weight = sum_quarantine_carcasses_weight['total_weight'] or 0
    total_province_live_weight += \
        difference_requests.aggregate(total=Sum('weight'))['total'] or 0

    difference_requests_weight = \
        difference_requests.aggregate(total=Sum('weight'))['total'] or 0
    return_total_province_live_weight = return_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
                                            'total'] or 0
    return_total_province_live_weight += return_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))[
                                             'total'] or 0
    final_date = '2025-05-28'

    total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__lte=final_date).aggregate(
            total=Sum('real_weight_of_carcasses'))['total'] or 0
    new_total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.filter(date__date__gt=final_date,
                                             quarantine_weight_of_carcasses__gt=0).aggregate(
            total_weight=Sum(
                Case(
                    When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
                         then=F('real_weight_of_carcasses')),
                    default=F('quarantine_weight_of_carcasses'),
                    output_field=FloatField()
                )
            )
        )
    new_out_selling = new_total_out_selling_province_carcasses_weight['total_weight'] or 0

    total_out_selling_province_carcasses_weight += new_out_selling

    if wage_counting_type == 'live':
        total_province_carcasses_weight = total_province_live_weight
        total_pure_province_carcasses_weight = total_province_carcasses_weight
    else:
        return_total_province_live_weight = int(return_total_province_live_weight * 0.75)
        total_province_carcasses_weight = total_province_live_weight * 0.75
        difference_requests_weight = difference_requests_weight * 0.75
        total_out_carcasses_buying_for_pure_province_carcasses_weight = \
            kill_house_free_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0
        out_selling_out_carcasses_buying_difference = total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight if (
                                                                                                                                                                             total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight) > 0 else 0
        total_pure_province_carcasses_weight = total_province_carcasses_weight - out_selling_out_carcasses_buying_difference
    total_out_live_buying_province_carcasses_weight = \
        kill_house_free_bar_info.filter(buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
    real_total_out_live_buying_province_carcasses_weight = total_out_live_buying_province_carcasses_weight
    if new_out_selling_count_wage:
        if out_selling_ignore:
            before_total_out_live_buying_province_carcasses_weight = \
                kill_house_free_bar_info.filter(create_date__date__lt=new_out_selling_count_wage_date,
                                                buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
            after_total_out_live_buying_province_carcasses_weight = \
                kill_house_free_bar_info.filter(create_date__date__gte=new_out_selling_count_wage_date,
                                                buy_type='live').aggregate(total=Sum('live_weight'))['total'] or 0
            get_new_wage = get_new_wage_for_free_buying(kill_house_free_sale_bar_info)

            before_new_out_selling = get_new_wage['before_new_out_selling']
            after_new_out_selling = get_new_wage['after_new_out_selling']
            max_amount = before_total_out_live_buying_province_carcasses_weight * 0.80
            if max_amount <= before_new_out_selling:
                before_total_out_live_buying_province_carcasses_weight -= max_amount
            else:
                before_total_out_live_buying_province_carcasses_weight -= before_new_out_selling

            if after_total_out_live_buying_province_carcasses_weight > after_new_out_selling:
                extra_company_amount = int(after_new_out_selling * extra_company_amount)
                after_total_out_live_buying_province_carcasses_weight -= after_new_out_selling

            else:
                extra_company_amount = int(after_total_out_live_buying_province_carcasses_weight * extra_company_amount)

                after_total_out_live_buying_province_carcasses_weight = 0

            total_out_live_buying_province_carcasses_weight = before_total_out_live_buying_province_carcasses_weight + after_total_out_live_buying_province_carcasses_weight

    else:
        if out_selling_ignore:
            max_amount = total_out_live_buying_province_carcasses_weight * 0.80
            if max_amount <= new_out_selling:
                total_out_live_buying_province_carcasses_weight -= max_amount
            else:
                total_out_live_buying_province_carcasses_weight -= new_out_selling

        # else:
        #     total_out_live_buying_province_carcasses_weight -= total_out_selling_province_quarantine_carcasses_weight
    total_out_carcasses_buying_province_carcasses_weight = \
        kill_house_free_bar_info.filter(buy_type='carcass').aggregate(total=Sum('weight_of_carcasses'))['total'] or 0

    total_pure_province_carcasses_price = total_pure_province_carcasses_weight * province_live_wage_type_amount
    difference_requests_price = difference_requests_weight * province_live_wage_type_amount
    total_return_pure_province_carcasses_price = return_total_province_live_weight * province_live_wage_type_amount
    total_out_selling_province_carcasses_price = total_out_selling_province_carcasses_weight * free_sell_carcesses_weight_wage_type_amount
    if new_out_selling_count_wage:
        total_out_live_buying_province_carcasses_price = int(
            (before_total_out_live_buying_province_carcasses_weight * before_out_buying_count_wage_amount) + (
                    after_total_out_live_buying_province_carcasses_weight * free_buying_live_weight_wage_type_amount))
    else:
        total_out_live_buying_province_carcasses_price = total_out_live_buying_province_carcasses_weight * free_buying_live_weight_wage_type_amount

    total_out_carcasses_buying_province_carcasses_price = total_out_carcasses_buying_province_carcasses_weight * free_buying_carcesses_weight_wage_type_amount
    total_price = total_pure_province_carcasses_price + total_out_selling_province_carcasses_price + total_out_live_buying_province_carcasses_price + total_out_carcasses_buying_province_carcasses_price + extra_company_amount + total_return_pure_province_carcasses_price

    return {
        "total_province_live_weight": total_province_live_weight,
        "total_province_carcasses_weight": total_province_carcasses_weight,
        "total_out_selling_province_carcasses_weight": total_out_selling_province_carcasses_weight,
        "total_pure_province_carcasses_weight": total_pure_province_carcasses_weight,
        "total_pure_province_carcasses_price": total_pure_province_carcasses_price,
        "total_out_selling_province_carcasses_price": total_out_selling_province_carcasses_price,
        "total_out_carcasses_buying_province_carcasses_weight": total_out_carcasses_buying_province_carcasses_weight,
        "total_out_carcasses_buying_province_carcasses_price": total_out_carcasses_buying_province_carcasses_price,
        "total_out_live_buying_province_carcasses_weight": real_total_out_live_buying_province_carcasses_weight,
        "total_out_live_buying_province_carcasses_price": total_out_live_buying_province_carcasses_price,
        "total_paid_wage": total_paid_wage,
        "total_price": total_price,
        "province_live_wage_amount": province_live_wage_type_amount,
        "free_buying_live_weight_amount": free_buying_live_weight_wage_type_amount,
        "free_buying_carcesses_weight_amount": free_buying_carcesses_weight_wage_type_amount,
        "free_sell_carcesses_weight_amount": free_sell_carcesses_weight_wage_type_amount,
        "extra_company_amount": extra_company_amount,
        "before_total_out_live_buying_province_carcasses_weight": before_total_out_live_buying_province_carcasses_weight,
        "after_total_out_live_buying_province_carcasses_weight": after_total_out_live_buying_province_carcasses_weight,
        "before_new_out_selling": before_new_out_selling,
        "after_new_out_selling": after_new_out_selling,
        "return_total_province_live_weight": return_total_province_live_weight,
        "total_return_pure_province_carcasses_price": total_return_pure_province_carcasses_price,
        "difference_requests_weight": difference_requests_weight,
        "difference_requests_price": difference_requests_price,

    }


def get_difference_carcasses_weight(kill_houses, date1=None, date2=None):
    difference_weight = 0
    for kill_house in kill_houses:
        if date1:

            kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
                                                                                  archive_wage=False,
                                                                                  calculate_status=True,
                                                                                  trash=False, date__date__gte=date1,
                                                                                  date__date__lte=date2)
            kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
                kill_house=kill_house,
                archive_wage=False,
                calculate_status=True,
                trash=False, date__date__gte=date1, date__date__lte=date2)
        else:
            kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
                                                                                  archive_wage=False,
                                                                                  calculate_status=True,
                                                                                  trash=False)
            kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
                kill_house=kill_house,
                archive_wage=False,
                calculate_status=True,
                trash=False)
        total_out_carcasses_buying_for_pure_province_carcasses_weight = \
            kill_house_free_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0
        # total_out_selling_province_carcasses_weight = \
        #     kill_house_free_sale_bar_info.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0

        final_date = '2025-05-28'
        total_out_selling_province_carcasses_weight = \
            kill_house_free_sale_bar_info.filter(date__date__lte=final_date).aggregate(
                total=Sum('real_weight_of_carcasses'))['total'] or 0
        new_total_out_selling_province_carcasses_weight = \
            kill_house_free_sale_bar_info.filter(date__date__gt=final_date,
                                                 quarantine_weight_of_carcasses__gt=0).aggregate(
                total_weight=Sum(
                    Case(
                        When(real_weight_of_carcasses__lt=F('quarantine_weight_of_carcasses'),
                             then=F('real_weight_of_carcasses')),
                        default=F('quarantine_weight_of_carcasses'),
                        output_field=FloatField()
                    )
                )
            )
        total_out_selling_province_carcasses_weight += new_total_out_selling_province_carcasses_weight[
                                                           'total_weight'] or 0
        out_selling_out_carcasses_buying_difference = total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight if (
                                                                                                                                                                             total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight) > 0 else 0

        difference_weight += out_selling_out_carcasses_buying_difference

    return difference_weight


def get_difference_carcasses_percent(date1=None, date2=None):
    different_percent = 0
    kill_houses = KillHouse.objects.filter(out_province=False, trash=False).order_by('id')
    if date1:
        total_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False,
                                                                          archive_wage=False, return_to_province=False,
                                                                          state__in=('pending', 'accepted'),
                                                                          kill_request__recive_date__date__gte=date1,
                                                                          kill_request__recive_date__date__lte=date2,
                                                                          first_car_allocated_quantity=0).order_by('id')
        total_kill_house_requests = KillHouseRequest.objects.filter(
            Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q(
                Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q(
                Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False,
            trash=False, calculate_status=True,
            kill_request__recive_date__date__gte=date1,
            kill_request__recive_date__date__lte=date2,
        )
    else:
        total_province_kill_requests = ProvinceKillRequest.objects.filter(killhouse_user__in=kill_houses, trash=False,
                                                                          archive_wage=False, return_to_province=False,
                                                                          state__in=('pending', 'accepted'),
                                                                          first_car_allocated_quantity=0).order_by('id')
        total_kill_house_requests = KillHouseRequest.objects.filter(
            Q(Q(killhouse_user__in=kill_houses) & Q(killer__in=kill_houses)) | Q(
                Q(killhouse_user__in=kill_houses) & Q(killer__isnull=True)) | Q(
                Q(killhouse_user__in=kill_houses) | Q(killer__in=kill_houses)), archive_wage=False,
            trash=False, calculate_status=True
        )

    total_province_live_weight = total_province_kill_requests.aggregate(total=Sum('total_killed_weight'))[
                                     'total'] or 0
    total_province_live_quantity = total_province_kill_requests.aggregate(total=Sum('total_killed_quantity'))[
                                       'total'] or 0
    total_province_live_weight += total_kill_house_requests.aggregate(total=Sum('accepted_real_weight'))['total'] or 0
    total_province_live_quantity += total_kill_house_requests.aggregate(total=Sum('accepted_real_quantity'))[
                                        'total'] or 0
    difference_requests = BarDifferenceRequest.objects.filter(kill_house__in=kill_houses, trash=False, state='accepted')
    total_province_live_weight += \
        difference_requests.aggregate(total=Sum('weight'))['total'] or 0

    total_province_carcasses_weight = total_province_live_weight * 0.75

    total_pure_province_carcasses_weight = total_province_carcasses_weight - get_difference_carcasses_weight(
        kill_houses, date1, date2)

    different_percent = total_pure_province_carcasses_weight / total_province_carcasses_weight

    return different_percent


def generate_unique_bar_code():
    shamsi_year = jdatetime.date.fromgregorian(year=datetime.datetime.now().year, month=1, day=1).year
    last_digit = str(shamsi_year)[-1]
    while True:
        code = int(province_id + last_digit + str(uuid.uuid4().int)[:5])

        if not KillHouseFreeBarInformation.objects.filter(bar_code=code, trash=False).exists():
            return code


def send_ticket_for_bar_difference_request(user, kill_house, quantity, poultry):
    new_ticket = TicketSupport(
        user=user,
        title="پیام سیستمی:درخواست رسیدگی اختلاف کشتار",
        status='open',
        read_only=True,
        type_ticket='single',
        parent=None,
        last_message='Admin',
    )
    new_ticket.save()
    new_ticket.to_user.add(kill_house)

    message = 'با سلام و احترام این پیام از طرف سامانه میباشد.' \
              '\n' \
              f'کاربر گرامی برای شما  حجم {quantity} قطعه اختلاف کشتار از مرغدار {poultry} ثبت گردیده لطفا جهت تعیین تکلیف به بخش مدیریت بار قسمت اختلاف کشتار مراجعه نمایید.باتشکر سامانه رصدیار '
    msg = MessageSupport(
        ticket=new_ticket,
        message=message,
        created_by=user,
        sender='Admin'
    )
    msg.save()


def get_difference_carcasses_weight_kill(kill_house, date1=None, date2=None):
    if date1:
        kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
                                                                              archive_wage=False, date__date__gte=date1,
                                                                              date__date__lte=date2,
                                                                              calculate_status=True,
                                                                              trash=False)
        kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
            kill_house=kill_house,
            archive_wage=False,
            calculate_status=True, date__date__gte=date1, date__date__lte=date2,
            trash=False)
    else:
        kill_house_free_bar_info = KillHouseFreeBarInformation.objects.filter(kill_house=kill_house,
                                                                              archive_wage=False,
                                                                              calculate_status=True,
                                                                              trash=False)
        kill_house_free_sale_bar_info = KillHouseFreeSaleBarInformation.objects.filter(
            kill_house=kill_house,
            archive_wage=False,
            calculate_status=True,
            trash=False)
    total_out_carcasses_buying_for_pure_province_carcasses_weight = \
        kill_house_free_bar_info.aggregate(total=Sum('weight_of_carcasses'))['total'] or 0
    total_out_selling_province_carcasses_weight = \
        kill_house_free_sale_bar_info.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
    out_selling_out_carcasses_buying_difference = total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight if (
                                                                                                                                                                         total_out_selling_province_carcasses_weight - total_out_carcasses_buying_for_pure_province_carcasses_weight) > 0 else 0

    difference_weight = out_selling_out_carcasses_buying_difference

    return difference_weight


def get_calculate_shares(kill_house):
    before_total_out_live_buying_province_carcasses_price = 0
    total_wage_type = WageType.objects.filter(trash=False)
    free_buying_live_weight_wage_type = total_wage_type.filter(en_name='live-buy', trash=False).first()
    free_buying_live_weight_wage_type_amount = free_buying_live_weight_wage_type.amount if free_buying_live_weight_wage_type.status == True else 0
    wage_info = get_finance_info(kill_house)

    slaughter_transactions = InternalTransaction.objects.filter(
        Q(kill_house=kill_house) | Q(parent_kill_house=kill_house), status='completed',
        trash=False)

    total_paid_wage = slaughter_transactions.aggregate(total=Sum('amount'))[
                          'total'] or 0

    # total_pure_province_carcasses_price = wage_info['total_pure_province_carcasses_price'] + wage_info[
    #     'total_return_pure_province_carcasses_price']
    total_pure_province_carcasses_price = wage_info['total_pure_province_carcasses_price']
    total_out_selling_province_carcasses_price = wage_info['total_out_selling_province_carcasses_price']
    difference_requests_price = wage_info['difference_requests_price']
    total_return_pure_province_carcasses_price = wage_info['total_return_pure_province_carcasses_price']

    if new_out_selling_count_wage:
        total_out_live_buying_province_carcasses_price = int(
            (wage_info[
                 'before_total_out_live_buying_province_carcasses_weight'] * before_out_buying_count_wage_amount) + (
                    wage_info[
                        'after_total_out_live_buying_province_carcasses_weight'] * free_buying_live_weight_wage_type_amount))

        before_total_out_live_buying_province_carcasses_price = wage_info[
                                                                    'before_total_out_live_buying_province_carcasses_weight'] * before_out_buying_count_wage_amount
    else:
        total_out_live_buying_province_carcasses_price = wage_info[
            'total_out_live_buying_province_carcasses_price']
    total_out_carcasses_buying_province_carcasses_price = wage_info[
        'total_out_carcasses_buying_province_carcasses_price']
    total_price = wage_info['total_price']

    percentages_wage_type = PercentageOfWageType.objects.filter(trash=False)
    union_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='union').first().percent / 100
    company_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='company').first().percent / 100
    guilds_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='guilds').first().percent / 100
    other_province_kill_request_percent = percentages_wage_type.filter(
        wage_type__en_name='province-kill-request', share_type__en_name='other').first().percent / 100

    union_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                  share_type__en_name='union').first().percent / 100
    union_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                       share_type__en_name='union').first().percent / 100
    company_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                    share_type__en_name='company').first().percent / 100
    company_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                         share_type__en_name='company').first().percent / 100
    guilds_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                   share_type__en_name='guilds').first().percent / 100
    guilds_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                        share_type__en_name='guilds').first().percent / 100
    other_free_buying_live_percent = percentages_wage_type.filter(wage_type__en_name='live-buy',
                                                                  share_type__en_name='other').first().percent / 100
    other_free_buying_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-buy',
                                                                       share_type__en_name='other').first().percent / 100

    union_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                     share_type__en_name='union').first().percent / 100
    company_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                       share_type__en_name='company').first().percent / 100
    guilds_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                      share_type__en_name='guilds').first().percent / 100
    other_free_sell_carcasses_percent = percentages_wage_type.filter(wage_type__en_name='carcasse-sell',
                                                                     share_type__en_name='other').first().percent / 100

    union_province_kill_request_wage = total_pure_province_carcasses_price * union_province_kill_request_percent
    return_union_province_kill_request_wage = total_return_pure_province_carcasses_price * union_province_kill_request_percent

    union_free_buying_live_wage = (
                                          total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * union_free_buying_live_percent
    union_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * union_free_buying_carcasses_percent
    union_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * union_free_sell_carcasses_percent
    union_total_wage = union_province_kill_request_wage + union_free_buying_live_wage + union_free_buying_carcasses_wage + union_free_sell_carcasses_wage + return_union_province_kill_request_wage
    union_total_paid_wage = slaughter_transactions.aggregate(total=Sum('union_share'))['total'] or 0
    union_total_unpaid_wage = union_total_wage - union_total_paid_wage

    guilds_difference_requests_price = difference_requests_price * guilds_province_kill_request_percent
    other_difference_requests_price = difference_requests_price * other_province_kill_request_percent
    guild_return_province_kill_request_wage = total_return_pure_province_carcasses_price * guilds_province_kill_request_percent
    other_return_province_kill_request_wage = total_return_pure_province_carcasses_price * other_province_kill_request_percent

    # company_province_kill_request_wage = (
    #                                              total_pure_province_carcasses_price * company_province_kill_request_percent) + (
    #                                              guilds_difference_requests_price + other_difference_requests_price + guild_return_province_kill_request_wage + other_return_province_kill_request_wage)

    company_province_kill_request_wage = (
                                                     total_pure_province_carcasses_price * company_province_kill_request_percent) + (
                                                     guilds_difference_requests_price + other_difference_requests_price)
    return_company_province_kill_request_wage = (
                                                            total_return_pure_province_carcasses_price * company_province_kill_request_percent) + (
                                                            guild_return_province_kill_request_wage + other_return_province_kill_request_wage)
    company_free_buying_live_wage = ((
                                             total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * company_free_buying_live_percent) + before_total_out_live_buying_province_carcasses_price
    company_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * company_free_buying_carcasses_percent
    company_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * company_free_sell_carcasses_percent
    company_total_wage = company_province_kill_request_wage + company_free_buying_live_wage + company_free_buying_carcasses_wage + company_free_sell_carcasses_wage + return_company_province_kill_request_wage
    company_total_paid_wage = slaughter_transactions.aggregate(total=Sum('company_share'))['total'] or 0
    company_total_unpaid_wage = company_total_wage - company_total_paid_wage

    guilds_province_kill_request_wage = (total_pure_province_carcasses_price * guilds_province_kill_request_percent) - (
            guilds_difference_requests_price + guild_return_province_kill_request_wage)
    guilds_free_buying_live_wage = (
                                           total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * guilds_free_buying_live_percent
    guilds_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * guilds_free_buying_carcasses_percent
    guilds_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * guilds_free_sell_carcasses_percent
    guilds_total_wage = guilds_province_kill_request_wage + guilds_free_buying_live_wage + guilds_free_buying_carcasses_wage + guilds_free_sell_carcasses_wage
    guilds_total_paid_wage = slaughter_transactions.aggregate(total=Sum('guilds_share'))['total'] or 0
    guilds_total_unpaid_wage = guilds_total_wage - guilds_total_paid_wage

    other_province_kill_request_wage = (total_pure_province_carcasses_price * other_province_kill_request_percent) - (
            other_difference_requests_price + other_return_province_kill_request_wage)
    other_free_buying_live_wage = (
                                          total_out_live_buying_province_carcasses_price - before_total_out_live_buying_province_carcasses_price) * other_free_buying_live_percent
    other_free_buying_carcasses_wage = total_out_carcasses_buying_province_carcasses_price * other_free_buying_carcasses_percent
    other_free_sell_carcasses_wage = total_out_selling_province_carcasses_price * other_free_sell_carcasses_percent
    other_total_wage = other_province_kill_request_wage + other_free_buying_live_wage + other_free_buying_carcasses_wage + other_free_sell_carcasses_wage
    other_total_paid_wage = slaughter_transactions.aggregate(total=Sum('other_share'))['total'] or 0
    other_total_unpaid_wage = other_total_wage - other_total_paid_wage
    return [
        {
            "name": "اتحادیه",
            "province_kill_request_wage": union_province_kill_request_wage,
            "free_buying_live_wage": union_free_buying_live_wage,
            "free_buying_carcasses_wage": union_free_buying_carcasses_wage,
            "free_sell_carcasses_wage": union_free_sell_carcasses_wage,
            "total_wage": union_total_wage,
            "total_paid_wage": union_total_paid_wage,
            "total_unpaid_wage": union_total_unpaid_wage,
            "total_unpaid": total_price - total_paid_wage,
        },
        {
            "name": "شرکت",
            "province_kill_request_wage": company_province_kill_request_wage,
            "free_buying_live_wage": company_free_buying_live_wage,
            "free_buying_carcasses_wage": company_free_buying_carcasses_wage,
            "free_sell_carcasses_wage": company_free_sell_carcasses_wage,
            "total_wage": company_total_wage,
            "total_paid_wage": company_total_paid_wage,
            "total_unpaid_wage": company_total_unpaid_wage,
            "total_unpaid": total_price - total_paid_wage,

        },
        {
            "name": "صنف پروتئین",
            "province_kill_request_wage": guilds_province_kill_request_wage,
            "free_buying_live_wage": guilds_free_buying_live_wage,
            "free_buying_carcasses_wage": guilds_free_buying_carcasses_wage,
            "free_sell_carcasses_wage": guilds_free_sell_carcasses_wage,
            "total_wage": guilds_total_wage,
            "total_paid_wage": guilds_total_paid_wage,
            "total_unpaid_wage": guilds_total_unpaid_wage,
            "total_unpaid": total_price - total_paid_wage,

        },
        {
            "name": "دامپزشک",
            "province_kill_request_wage": other_province_kill_request_wage,
            "free_buying_live_wage": other_free_buying_live_wage,
            "free_buying_carcasses_wage": other_free_buying_carcasses_wage,
            "free_sell_carcasses_wage": other_free_sell_carcasses_wage,
            "total_wage": other_total_wage,
            "total_paid_wage": other_total_paid_wage,
            "total_unpaid_wage": other_total_unpaid_wage,
            "total_unpaid": total_price - total_paid_wage,

        }]


def get_kill_house_percent(kill_house):
    shares = get_calculate_shares(kill_house)
    union = shares[0]['total_unpaid_wage'] if shares[0]['total_unpaid_wage'] > 0 else 0
    company = shares[1]['total_unpaid_wage'] if shares[1]['total_unpaid_wage'] > 0 else 0
    guilds = shares[2]['total_unpaid_wage'] if shares[2]['total_unpaid_wage'] > 0 else 0
    vet = shares[3]['total_unpaid_wage'] if shares[3]['total_unpaid_wage'] > 0 else 0

    # if union >= company:
    #     return None
    # else:
    total = union + company + guilds + vet
    if total == 0 :
        return {
            "union": union,
            "company": company,
            "guilds": guilds,
            "vet": vet,
            "total_percent": total,
        }
    union = int((union / total) * 100)
    company = int((company / total) * 100)
    guilds = int((guilds / total) * 100)
    vet = int((vet / total) * 100)
    total_percent = union + company + guilds + vet

    if total_percent < 100:
        if base_url_for_sms_report == 'ma':
            if union >= company:
                union += 100 - total_percent
            else:
                company += 100 - total_percent

        else:
            company += 100 - total_percent

    return {
        "union": union,
        "company": company,
        "guilds": guilds,
        "vet": vet,
        "total_percent": total_percent,
    }


# def create_kill_house_free_bar(request):
#     kill = KillHouse.objects.filter(trash=False, unique_identifier__isnull=False).order_by('id').values_list(
#         'unique_identifier', flat=True)
#     kill_house_list = {
#         "kill_house": list(kill)
#     }
#     response = requests.post('https://rsibackend.rasadyar.com/app/get_bar_info/', data=kill_house_list)
#     try:
#         bars = response.json()
#     except ValueError:
#         return
#     if not isinstance(bars, list):
#         return
#     for bar in bars:
#         try:
#             if not isinstance(bar, dict):
#                 continue
#             des_part_id_code = bar.get('DesPartIdCode')
#             if not des_part_id_code:
#                 continue
#             kill_house = KillHouse.objects.filter(trash=False, unique_identifier=des_part_id_code).first()
#             if not kill_house:
#                 continue
#             if KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=bar.get('TrackingCode')).exists():
#                 continue
#             product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
#             formatted_str = str(bar.get('Date')).replace('T', ' ').replace('Z', '')
#             date = datetime.datetime.strptime(formatted_str, '%Y-%m-%d %H:%M:%S').date()
#             date = datetime.datetime(year=date.year, month=date.month, day=date.day, hour=10,
#                                      minute=1,
#                                      second=1)
#             kill_house_free_bar_info = KillHouseFreeBarInformation(
#                 kill_house=kill_house,
#                 product=product,
#             )
#             kill_house_free_bar_info.driver_name = 'سیستمی'
#             kill_house_free_bar_info.driver_mobile = '0'
#             kill_house_free_bar_info.input_warehouse = kill_house
#             kill_house_free_bar_info.poultry_name = bar.get('hatching', {}).get('poultry', {}).get('UnitName')
#             kill_house_free_bar_info.poultry_mobile = bar.get('hatching', {}).get('poultry', {}).get('Mobile')
#             kill_house_free_bar_info.province = bar.get('hatching', {}).get('poultry', {}).get('Province')
#             kill_house_free_bar_info.city = bar.get('hatching', {}).get('poultry', {}).get('City')
#             kill_house_free_bar_info.bar_clearance_code = bar.get('TrackingCode')
#             kill_house_free_bar_info.quantity = bar.get('GoodAmount')
#             kill_house_free_bar_info.live_weight = int(int(bar.get('GoodAmount')) * 2.5)
#             kill_house_free_bar_info.buy_type = 'live'
#             kill_house_free_bar_info.car = '0'
#             kill_house_free_bar_info.register_type = 'automatic'
#             kill_house_free_bar_info.date = datetime.datetime.now()
#             kill_house_free_bar_info.bar_code = generate_unique_bar_code()
#             kill_house_free_bar_info.save()
#             wage = 0
#             type = 'live-buy' if kill_house_free_bar_info.buy_type == 'live' else 'carcasse-buy'
#             wage_type = WageType.objects.filter(en_name=type, trash=False).first()
#             if wage_type and wage_type.status is True:
#                 wage = wage_type.amount
#             kill_house_free_bar_info.wage = wage
#             kill_house_free_bar_info.total_wage_amount = wage * int(
#                 kill_house_free_bar_info.live_weight) if kill_house_free_bar_info.buy_type == 'live' else wage * int(
#                 kill_house_free_bar_info.weight_of_carcasses)
#             kill_house_free_bar_info.save()
#             kill_house_free_bar_info.create_date = date
#             kill_house_free_bar_info.register_date = datetime.datetime.now()
#             kill_house_free_bar_info.save()
#             kill_house_free_buying_product_warehousing(product)
#             percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0,
#                                                                         trash=False)
#             if wage_type and wage_type.status is True and percentages_wage_type:
#                 for percentage_wage_type in percentages_wage_type:
#                     if percentage_wage_type.share_type.en_name == 'union':
#                         kill_house_free_bar_info.union_share = int(
#                             (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
#                         kill_house_free_bar_info.union_share_percent = percentage_wage_type.percent
#                         kill_house_free_bar_info.save()
#                     elif percentage_wage_type.share_type.en_name == 'company':
#                         kill_house_free_bar_info.company_share = int(
#                             (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
#                         kill_house_free_bar_info.company_share_percent = percentage_wage_type.percent
#                         kill_house_free_bar_info.save()
#                     elif percentage_wage_type.share_type.en_name == 'guilds':
#                         kill_house_free_bar_info.guilds_share = int(
#                             (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
#                         kill_house_free_bar_info.guilds_share_percent = percentage_wage_type.percent
#                         kill_house_free_bar_info.save()
#                     elif percentage_wage_type.share_type.en_name == 'city':
#                         kill_house_free_bar_info.city_share = int(
#                             (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
#                         kill_house_free_bar_info.city_share_percent = percentage_wage_type.percent
#                         kill_house_free_bar_info.save()
#                     elif percentage_wage_type.share_type.en_name == 'wallet':
#                         kill_house_free_bar_info.wallet_share = int(
#                             (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
#                         kill_house_free_bar_info.wallet_share_percent = percentage_wage_type.percent
#                         kill_house_free_bar_info.save()
#                     else:
#                         kill_house_free_bar_info.other_share = int(
#                             (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
#                         kill_house_free_bar_info.other_share_percent = percentage_wage_type.percent
#                         kill_house_free_bar_info.save()
#         except Exception:
#             continue
#     return HttpResponse('ok')


def create_kill_house_free_bar(request):
    kill = KillHouse.objects.filter(trash=False, unique_identifier__isnull=False).order_by('id').values_list(
        'unique_identifier', flat=True)
    kill_house_list = {
        "kill_house": list(kill)
    }
    response = requests.post('https://rsibackend.rasadyar.com/app/get_bar_info/', data=kill_house_list)
    try:
        bars = response.json()
    except ValueError:
        return HttpResponse('ok')
    if not isinstance(bars, list):
        return HttpResponse('ok')
    for bar in bars:
        try:
            if not isinstance(bar, dict):
                continue
            des_part_id_code = bar.get('jihadi_destination')
            if not des_part_id_code:
                continue
            kill_house = KillHouse.objects.filter(trash=False, unique_identifier=des_part_id_code).first()
            if not kill_house:
                continue
            if KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=bar.get('tracking')).exists():
                continue
            product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
            formatted_str = str(bar.get('date')).replace('T', ' ').replace('Z', '')
            date = datetime.datetime.strptime(formatted_str, '%Y-%m-%d').date()
            date = datetime.datetime(year=date.year, month=date.month, day=date.day, hour=10,
                                     minute=1,
                                     second=1)
            kill_house_free_bar_info = KillHouseFreeBarInformation(
                kill_house=kill_house,
                product=product,
            )
            kill_house_free_bar_info.driver_name = 'سیستمی'
            kill_house_free_bar_info.driver_mobile = '0'
            kill_house_free_bar_info.input_warehouse = kill_house
            kill_house_free_bar_info.poultry_name = bar.get('hatching', {}).get('poultry', {}).get('UnitName')
            kill_house_free_bar_info.poultry_mobile = bar.get('hatching', {}).get('poultry', {}).get('Mobile')
            kill_house_free_bar_info.province = bar.get('hatching', {}).get('poultry', {}).get('Province')
            kill_house_free_bar_info.city = bar.get('hatching', {}).get('poultry', {}).get('City')
            kill_house_free_bar_info.bar_clearance_code = bar.get('tracking')
            kill_house_free_bar_info.quantity = bar.get('quantity')
            kill_house_free_bar_info.live_weight = int(int(bar.get('quantity')) * 2.5)
            kill_house_free_bar_info.buy_type = 'live'
            kill_house_free_bar_info.car = '0'
            kill_house_free_bar_info.register_type = 'automatic'
            kill_house_free_bar_info.date = datetime.datetime.now()
            kill_house_free_bar_info.bar_code = generate_unique_bar_code()
            kill_house_free_bar_info.save()
            wage = 0
            type = 'live-buy' if kill_house_free_bar_info.buy_type == 'live' else 'carcasse-buy'
            wage_type = WageType.objects.filter(en_name=type, trash=False).first()
            if wage_type and wage_type.status is True:
                wage = wage_type.amount
            kill_house_free_bar_info.wage = wage
            kill_house_free_bar_info.total_wage_amount = wage * int(
                kill_house_free_bar_info.live_weight) if kill_house_free_bar_info.buy_type == 'live' else wage * int(
                kill_house_free_bar_info.weight_of_carcasses)
            kill_house_free_bar_info.save()
            kill_house_free_bar_info.create_date = date
            kill_house_free_bar_info.register_date = datetime.datetime.now()
            kill_house_free_bar_info.save()
            kill_house_free_buying_product_warehousing(product)
            percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0,
                                                                        trash=False)
            if wage_type and wage_type.status is True and percentages_wage_type:
                for percentage_wage_type in percentages_wage_type:
                    if percentage_wage_type.share_type.en_name == 'union':
                        kill_house_free_bar_info.union_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.union_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'company':
                        kill_house_free_bar_info.company_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.company_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'guilds':
                        kill_house_free_bar_info.guilds_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.guilds_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'city':
                        kill_house_free_bar_info.city_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.city_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'wallet':
                        kill_house_free_bar_info.wallet_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.wallet_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    else:
                        kill_house_free_bar_info.other_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.other_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
        except Exception:
            continue
    return HttpResponse('ok')


def create_kill_house_free_bar_cron():
    kill = KillHouse.objects.filter(trash=False, unique_identifier__isnull=False).order_by('id').values_list(
        'unique_identifier', flat=True)
    kill_house_list = {
        "kill_house": list(kill)
    }
    response = requests.post('https://rsibackend.rasadyar.com/app/get_bar_info/', data=kill_house_list)
    try:
        bars = response.json()
    except ValueError:
        return
    if not isinstance(bars, list):
        return
    for bar in bars:
        try:
            if not isinstance(bar, dict):
                continue
            des_part_id_code = bar.get('jihadi_destination')
            if not des_part_id_code:
                continue
            kill_house = KillHouse.objects.filter(trash=False, unique_identifier=des_part_id_code).first()
            if not kill_house:
                continue
            if KillHouseFreeBarInformation.objects.filter(trash=False, bar_clearance_code=bar.get('tracking')).exists():
                continue
            product = RolesProducts.objects.filter(kill_house=kill_house, trash=False, name='مرغ گرم').first()
            formatted_str = str(bar.get('date')).replace('T', ' ').replace('Z', '')
            date = datetime.datetime.strptime(formatted_str, '%Y-%m-%d').date()
            date = datetime.datetime(year=date.year, month=date.month, day=date.day, hour=10,
                                     minute=1,
                                     second=1)
            kill_house_free_bar_info = KillHouseFreeBarInformation(
                kill_house=kill_house,
                product=product,
            )
            kill_house_free_bar_info.driver_name = 'سیستمی'
            kill_house_free_bar_info.driver_mobile = '0'
            kill_house_free_bar_info.input_warehouse = kill_house
            kill_house_free_bar_info.poultry_name = bar.get('hatching', {}).get('poultry', {}).get('UnitName')
            kill_house_free_bar_info.poultry_mobile = bar.get('hatching', {}).get('poultry', {}).get('Mobile')
            kill_house_free_bar_info.province = bar.get('hatching', {}).get('poultry', {}).get('Province')
            kill_house_free_bar_info.city = bar.get('hatching', {}).get('poultry', {}).get('City')
            kill_house_free_bar_info.bar_clearance_code = bar.get('tracking')
            kill_house_free_bar_info.quantity = bar.get('quantity')
            kill_house_free_bar_info.live_weight = int(int(bar.get('quantity')) * 2.5)
            kill_house_free_bar_info.buy_type = 'live'
            kill_house_free_bar_info.car = '0'
            kill_house_free_bar_info.register_type = 'automatic'
            kill_house_free_bar_info.date = datetime.datetime.now()
            kill_house_free_bar_info.bar_code = generate_unique_bar_code()
            kill_house_free_bar_info.save()
            wage = 0
            type = 'live-buy' if kill_house_free_bar_info.buy_type == 'live' else 'carcasse-buy'
            wage_type = WageType.objects.filter(en_name=type, trash=False).first()
            if wage_type and wage_type.status is True:
                wage = wage_type.amount
            kill_house_free_bar_info.wage = wage
            kill_house_free_bar_info.total_wage_amount = wage * int(
                kill_house_free_bar_info.live_weight) if kill_house_free_bar_info.buy_type == 'live' else wage * int(
                kill_house_free_bar_info.weight_of_carcasses)
            kill_house_free_bar_info.save()
            kill_house_free_bar_info.create_date = date
            kill_house_free_bar_info.register_date = datetime.datetime.now()
            kill_house_free_bar_info.save()
            kill_house_free_buying_product_warehousing(product)
            percentages_wage_type = PercentageOfWageType.objects.filter(wage_type=wage_type, percent__gt=0,
                                                                        trash=False)
            if wage_type and wage_type.status is True and percentages_wage_type:
                for percentage_wage_type in percentages_wage_type:
                    if percentage_wage_type.share_type.en_name == 'union':
                        kill_house_free_bar_info.union_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.union_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'company':
                        kill_house_free_bar_info.company_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.company_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'guilds':
                        kill_house_free_bar_info.guilds_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.guilds_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'city':
                        kill_house_free_bar_info.city_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.city_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    elif percentage_wage_type.share_type.en_name == 'wallet':
                        kill_house_free_bar_info.wallet_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.wallet_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
                    else:
                        kill_house_free_bar_info.other_share = int(
                            (percentage_wage_type.percent / 100) * kill_house_free_bar_info.total_wage_amount)
                        kill_house_free_bar_info.other_share_percent = percentage_wage_type.percent
                        kill_house_free_bar_info.save()
        except Exception:
            continue


def market_poultry_request_remain_quantity(poultry_request):
    province_check = ProvinceCheckOperatorRequest.objects.get(poultry_request=poultry_request)
    province_kill_reqs = ProvinceKillRequest.objects.filter(trash=False,
                                                            province_request__poultry_request=poultry_request,
                                                            market=False,
                                                            return_to_province=False,
                                                            state__in=('pending', 'accepted'),
                                                            temporary_trash=False).only('total_killed_quantity') \
        .aggregate(total=Sum('total_killed_quantity'))
    kill_requests = KillRequest.objects.filter(trash=False, market=True, market_state__in=('pending', 'accepted'),
                                               poultry_request=poultry_request).only('kill_capacity') \
        .aggregate(total=Sum('kill_capacity'))
    new_remain = poultry_request.quantity - ((kill_requests['total'] or 0) + (province_kill_reqs['total'] or 0))
    new_quantity = poultry_request.quantity - ((kill_requests['total'] or 0) + (province_kill_reqs['total'] or 0))
    poultry_request.remain_quantity = new_remain if new_remain > 0 else 0
    poultry_request.save()
    province_check.quantity = new_quantity if new_quantity > 0 else 0
    province_check.save()


# def market_calculate_light_weight(kill_house, total_poultry_requests_quantity,
#                                   total_poultry_requests_quantity_light_weight):
#     real_total_light_weight_quantity = 0
#     kill_house_ids = KillHousePercentage.objects.filter(kill_house__type='exclusive', trash=False).values_list(
#         'kill_house', flat=True)
#     kill_houses = KillHouse.objects.filter(out_province=False, market_buying=True, market_light_capacity=True,
#                                            trash=False).exclude(
#         id__in=kill_house_ids).order_by('id', 'killer')
#     for kill_house_obj in kill_houses:
#         kill_house_share = int((kill_house_obj.market_capacity_percent / 100) * total_poultry_requests_quantity)
#         kill_house_light_weight_quantity = int(kill_house_share * (kill_house_obj.market_light_capacity_percent / 100))
#         real_total_light_weight_quantity += kill_house_light_weight_quantity
#         kill_house_share = 0
#         kill_house_light_weight_quantity = 0
#
#     kill_house_share = int((kill_house.market_capacity_percent / 100) * total_poultry_requests_quantity)
#
#     kill_house_light_weight_quantity = int(kill_house_share * (kill_house.market_light_capacity_percent / 100))
#
#     kill_house_real_percent = int((
#                                           kill_house_light_weight_quantity / real_total_light_weight_quantity) * 100) if real_total_light_weight_quantity > 0 else 0
#
#     kill_house_real_light_weight = int((kill_house_real_percent / 100) * total_poultry_requests_quantity_light_weight)
#
#     return kill_house_real_light_weight
#
#
# def market_kill_request_share_quantity(kill_house, date1=None, date2=None):
#     if kill_house.market_buying:
#         now = datetime.datetime.now().date()
#         market_light_capacity = kill_house.market_light_capacity
#         market_light_capacity_percent = kill_house.market_light_capacity_percent
#         market_light_share = 0
#
#         index_weight_category = IndexWeightCategory.objects.filter(trash=False).order_by('id')
#         light = index_weight_category.filter(name='سبک').first()
#         heavy = index_weight_category.filter(name='سنگین').first()
#
#         if date1:
#             poultry_requests = PoultryRequest.objects.filter(
#                 send_date__date__gte=date1,
#                 send_date__date__lte=date2,
#                 state_process='accepted',
#                 province_state='accepted',
#                 temporary_trash=False,
#                 trash=False,
#                 out=False,
#                 final_state__in=('pending', 'accepted'),
#                 market=True,
#             )
#
#             kill_house_market_kill_requests = KillRequest.objects.filter(trash=False, recive_date__date__gte=date1,
#                                                                          recive_date__date__lte=date2,
#                                                                          kill_house=kill_house, market=True,
#                                                                          market_state__in=('pending', 'accepted'))
#         else:
#             poultry_requests = PoultryRequest.objects.filter(
#                 send_date__date=now,
#                 state_process='accepted',
#                 province_state='accepted',
#                 temporary_trash=False,
#                 trash=False,
#                 out=False,
#                 final_state__in=('pending', 'accepted'),
#                 market=True,
#             )
#
#             kill_house_market_kill_requests = KillRequest.objects.filter(trash=False, recive_date__date=now,
#                                                                          kill_house=kill_house, market=True,
#                                                                          market_state__in=('pending', 'accepted'))
#
#         total_poultry_requests_quantity = poultry_requests.aggregate(total=Sum('quantity'))['total'] or 0
#
#         total_poultry_requests_quantity_light_weight = \
#             poultry_requests.filter(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value).aggregate(
#                 total=Sum('quantity'))['total'] or 0
#         total_remain_poultry_requests_quantity_light_weight = \
#             poultry_requests.filter(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value).aggregate(
#                 total=Sum('remain_quantity'))['total'] or 0
#
#         light_real_quantity = market_calculate_light_weight(kill_house, total_poultry_requests_quantity,
#                                                             total_poultry_requests_quantity_light_weight)
#
#         if kill_house.market_buying_limitation:
#             if kill_house.market_buying_capacity_percent_status:
#                 kill_house_today_share = int(
#                     (kill_house.market_capacity_percent / 100) * total_poultry_requests_quantity)
#
#             else:
#                 kill_house_today_share = int(
#                     kill_house.total_kill_capacity * (kill_house.total_kill_capacity_percent / 100))
#
#
#
#         else:
#             kill_house_today_share = total_poultry_requests_quantity
#
#         kill_house_market_kill_requests_quantity = \
#             kill_house_market_kill_requests.aggregate(total=Sum('kill_capacity'))[
#                 'total'] or 0
#         kill_house_market_kill_requests_quantity_weight = \
#             kill_house_market_kill_requests.aggregate(total=Sum(F('kill_capacity') * F('Index_weight')))[
#                 'total'] or 0
#         kill_house_market_kill_requests_quantity_first = \
#             kill_house_market_kill_requests.filter(market_final_accept=False).aggregate(total=Sum('kill_capacity'))[
#                 'total'] or 0
#
#         kill_house_market_kill_requests_quantity_first_weight = \
#             kill_house_market_kill_requests.filter(market_final_accept=False).aggregate(
#                 total=Sum(F('kill_capacity') * F('Index_weight')))[
#                 'total'] or 0
#         kill_house_market_kill_requests_quantity_final = \
#             kill_house_market_kill_requests.filter(market_final_accept=True).aggregate(total=Sum('kill_capacity'))[
#                 'total'] or 0
#         kill_house_market_kill_requests_quantity_final_weight = \
#             kill_house_market_kill_requests.filter(market_final_accept=True).aggregate(
#                 total=Sum(F('kill_capacity') * F('Index_weight')))[
#                 'total'] or 0
#
#         total_kill_house_market_kill_requests_quantity_agreement_light_weight = \
#             kill_house_market_kill_requests.filter(Index_weight__lt=light.min_value).aggregate(
#                 total=Sum('kill_capacity'))[
#                 'total'] or 0
#
#         total_kill_house_market_kill_requests_quantity_light_weight = \
#             kill_house_market_kill_requests.filter(Index_weight__gte=light.min_value,
#                                                    Index_weight__lt=light.max_value).aggregate(
#                 total=Sum('kill_capacity'))[
#                 'total'] or 0
#
#         total_kill_house_market_kill_requests_quantity_heavy_weight = \
#             kill_house_market_kill_requests.filter(Index_weight__gte=heavy.min_value,
#                                                    Index_weight__lte=heavy.max_value).aggregate(
#                 total=Sum('kill_capacity'))[
#                 'total'] or 0
#
#         if market_code_state:
#             kill_house_market_kill_requests_quantity_light_weight = \
#                 kill_house_market_kill_requests.filter(market_final_accept=True, market_code_status=True,
#                                                        input_market_code__isnull=False,
#                                                        Index_weight__lt=light.max_value).aggregate(
#                     total=Sum('kill_capacity'))[
#                     'total'] or 0
#         else:
#             kill_house_market_kill_requests_quantity_light_weight = \
#                 kill_house_market_kill_requests.filter(market_final_accept=True,
#                                                        Index_weight__lt=light.max_value).aggregate(
#                     total=Sum('kill_capacity'))[
#                     'total'] or 0
#
#         if market_light_capacity:
#             # market_light_share = int(kill_house_today_share * (market_light_capacity_percent / 100))
#             market_light_share = light_real_quantity
#
#         kill_house_today_left_share = kill_house_today_share - kill_house_market_kill_requests_quantity if (
#                                                                                                                    kill_house_today_share - kill_house_market_kill_requests_quantity) > 0 else 0
#
#     else:
#         total_poultry_requests_quantity = 0
#         total_poultry_requests_quantity_light_weight = 0
#         total_remain_poultry_requests_quantity_light_weight = 0
#         kill_house_today_share = 0
#         market_light_share = 0
#         kill_house_market_kill_requests_quantity_light_weight = 0
#         kill_house_market_kill_requests_quantity = 0
#         kill_house_today_left_share = 0
#         kill_house_market_kill_requests_quantity_first = 0
#         kill_house_market_kill_requests_quantity_final = 0
#         light_real_quantity = 0
#         kill_house_market_kill_requests_quantity_weight = 0
#         kill_house_market_kill_requests_quantity_first_weight = 0
#         kill_house_market_kill_requests_quantity_final_weight = 0
#         total_kill_house_market_kill_requests_quantity_agreement_light_weight = 0
#         total_kill_house_market_kill_requests_quantity_light_weight = 0
#         total_kill_house_market_kill_requests_quantity_heavy_weight = 0
#
#     result = {
#         "total_poultry_requests_quantity": total_poultry_requests_quantity,
#         "total_poultry_requests_quantity_light_weight": total_poultry_requests_quantity_light_weight,
#         "total_remain_poultry_requests_quantity_light_weight": total_remain_poultry_requests_quantity_light_weight,
#         "kill_house_today_share": kill_house_today_share,
#         "market_light_share": market_light_share,
#         "kill_house_market_kill_requests_quantity_light_weight": kill_house_market_kill_requests_quantity_light_weight,
#         "kill_house_market_kill_requests_quantity": kill_house_market_kill_requests_quantity,
#         "kill_house_market_kill_requests_quantity_first": kill_house_market_kill_requests_quantity_first,
#         "kill_house_market_kill_requests_quantity_final": kill_house_market_kill_requests_quantity_final,
#         "kill_house_today_left_share": kill_house_today_left_share,
#         "light_real_quantity": light_real_quantity,
#         "kill_house_market_kill_requests_quantity_weight": kill_house_market_kill_requests_quantity_weight,
#         "kill_house_market_kill_requests_quantity_first_weight": kill_house_market_kill_requests_quantity_first_weight,
#         "kill_house_market_kill_requests_quantity_final_weight": kill_house_market_kill_requests_quantity_final_weight,
#         "total_kill_house_market_kill_requests_quantity_agreement_light_weight": total_kill_house_market_kill_requests_quantity_agreement_light_weight,
#         "total_kill_house_market_kill_requests_quantity_light_weight": total_kill_house_market_kill_requests_quantity_light_weight,
#         "total_kill_house_market_kill_requests_quantity_heavy_weight": total_kill_house_market_kill_requests_quantity_heavy_weight,
#     }
#
#     return result


def market_calculate_light_weight(kill_house, total_kill_houses, total_poultry_requests_quantity,
                                  total_poultry_requests_quantity_light_weight):
    shares = total_kill_houses.annotate(
        kill_share=F('market_capacity_percent') * total_poultry_requests_quantity / 100.0,
        light_share=F('market_capacity_percent') * total_poultry_requests_quantity / 100.0 * F(
            'market_light_capacity_percent') / 100.0
    ).values_list('id', 'light_share')

    real_total_light_weight_quantity = sum([ls[1] for ls in shares])

    kill_house_light_share = next((ls[1] for ls in shares if ls[0] == kill_house.id), 0)

    kill_house_real_percent = int((
                                          kill_house_light_share / real_total_light_weight_quantity) * 100) if real_total_light_weight_quantity > 0 else 0

    kill_house_real_light_weight = int((kill_house_real_percent / 100) * total_poultry_requests_quantity_light_weight)

    return kill_house_real_light_weight


# def market_kill_request_share_quantity(kill_house, date1=None, date2=None, total_kill_houses=None):
#     result = {
#         "total_poultry_requests_quantity": 0,
#         "total_poultry_requests_quantity_light_weight": 0,
#         "total_remain_poultry_requests_quantity_light_weight": 0,
#         "kill_house_today_share": 0,
#         "market_light_share": 0,
#         "kill_house_market_kill_requests_quantity_light_weight": 0,
#         "kill_house_market_kill_requests_quantity": 0,
#         "kill_house_market_kill_requests_quantity_first": 0,
#         "kill_house_market_kill_requests_quantity_final": 0,
#         "kill_house_today_left_share": 0,
#         "light_real_quantity": 0,
#         "kill_house_market_kill_requests_quantity_weight": 0,
#         "kill_house_market_kill_requests_quantity_first_weight": 0,
#         "kill_house_market_kill_requests_quantity_final_weight": 0,
#         "total_kill_house_market_kill_requests_quantity_agreement_light_weight": 0,
#         "total_kill_house_market_kill_requests_quantity_light_weight": 0,
#         "total_kill_house_market_kill_requests_quantity_heavy_weight": 0,
#     }
#
#     if not kill_house.market_buying:
#         return result
#
#     now = datetime.datetime.now().date()
#     date_filter = Q(send_date__date=now)
#     kill_request_date_filter = Q(recive_date__date=now)
#
#     if date1:
#         date_filter = Q(send_date__date__gte=date1, send_date__date__lte=date2)
#         kill_request_date_filter = Q(recive_date__date__gte=date1, recive_date__date__lte=date2)
#
#     weights = IndexWeightCategory.objects.filter(trash=False)
#     light = weights.filter(name='سبک').first()
#     heavy = weights.filter(name='سنگین').first()
#
#     poultry_requests = PoultryRequest.objects.filter(
#         date_filter,
#         state_process='accepted',
#         province_state='accepted',
#         temporary_trash=False,
#         trash=False,
#         out=False,
#         final_state__in=('pending', 'accepted'),
#         market=True,
#     )
#
#     total_poultry_requests_quantity = poultry_requests.aggregate(total=Sum('quantity'))['total'] or 0
#     total_light_quantity = poultry_requests.filter(
#         Index_weight__gte=light.min_value,
#         Index_weight__lt=light.max_value
#     ).aggregate(total=Sum('quantity'))['total'] or 0
#     total_remain_light_quantity = poultry_requests.filter(
#         Index_weight__gte=light.min_value,
#         Index_weight__lt=light.max_value
#     ).aggregate(total=Sum('remain_quantity'))['total'] or 0
#
#     kill_requests = KillRequest.objects.filter(
#         kill_request_date_filter,
#         trash=False,
#         kill_house=kill_house,
#         market=True,
#         market_state__in=('pending', 'accepted')
#     )
#
#     kill_house_today_share = total_poultry_requests_quantity
#     if kill_house.market_buying_limitation:
#         if kill_house.market_buying_capacity_percent_status:
#             kill_house_today_share = int(kill_house.market_capacity_percent / 100 * total_poultry_requests_quantity)
#         else:
#             kill_house_today_share = int(kill_house.total_kill_capacity * kill_house.total_kill_capacity_percent / 100)
#
#     agg = kill_requests.aggregate(
#         total_kill_capacity=Sum('kill_capacity') or 0,
#         total_weight=Sum(F('kill_capacity') * F('Index_weight')) or 0,
#         total_first=Sum('kill_capacity', filter=Q(market_final_accept=False)) or 0,
#         total_first_weight=Sum(F('kill_capacity') * F('Index_weight'), filter=Q(market_final_accept=False)) or 0,
#         total_final=Sum('kill_capacity', filter=Q(market_final_accept=True)) or 0,
#         total_final_weight=Sum(F('kill_capacity') * F('Index_weight'), filter=Q(market_final_accept=True)) or 0,
#         total_agreement_light=Sum('kill_capacity', filter=Q(Index_weight__lt=light.min_value)) or 0,
#         total_light=Sum('kill_capacity',
#                         filter=Q(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value)) or 0,
#         total_heavy=Sum('kill_capacity',
#                         filter=Q(Index_weight__gte=heavy.min_value, Index_weight__lte=heavy.max_value)) or 0,
#     )
#
#     light_real_quantity = market_calculate_light_weight(kill_house, total_kill_houses, total_poultry_requests_quantity,
#                                                         total_light_quantity)
#     market_light_share = light_real_quantity if kill_house.market_light_capacity else 0
#     kill_house_today_left_share = max(0, kill_house_today_share - (agg['total_kill_capacity'] or 0))
#
#     result.update({
#         "total_poultry_requests_quantity": total_poultry_requests_quantity or 0,
#         "total_poultry_requests_quantity_light_weight": total_light_quantity or 0,
#         "total_remain_poultry_requests_quantity_light_weight": total_remain_light_quantity or 0,
#         "kill_house_today_share": kill_house_today_share or 0,
#         "market_light_share": market_light_share or 0,
#         "kill_house_market_kill_requests_quantity_light_weight": agg['total_light'] or 0,
#         "kill_house_market_kill_requests_quantity": agg['total_kill_capacity'] or 0,
#         "kill_house_market_kill_requests_quantity_first": agg['total_first'] or 0,
#         "kill_house_market_kill_requests_quantity_final": agg['total_final'] or 0,
#         "kill_house_today_left_share": kill_house_today_left_share or 0,
#         "light_real_quantity": light_real_quantity or 0,
#         "kill_house_market_kill_requests_quantity_weight": agg['total_weight'] or 0,
#         "kill_house_market_kill_requests_quantity_first_weight": agg['total_first_weight'] or 0,
#         "kill_house_market_kill_requests_quantity_final_weight": agg['total_final_weight'] or 0,
#         "total_kill_house_market_kill_requests_quantity_agreement_light_weight": agg['total_agreement_light'] or 0,
#         "total_kill_house_market_kill_requests_quantity_light_weight": agg['total_light'] or 0,
#         "total_kill_house_market_kill_requests_quantity_heavy_weight": agg['total_heavy'] or 0,
#     })
#
#     return result


def market_kill_request_share_quantity(
        kill_house,
        date1=None,
        date2=None,
        total_kill_houses=None,
        weights=None,
        precomputed_poultry=None
):
    result = {
        "total_poultry_requests_quantity": 0,
        "total_poultry_requests_quantity_light_weight": 0,
        "total_remain_poultry_requests_quantity_light_weight": 0,
        "kill_house_today_share": 0,
        "market_light_share": 0,
        "kill_house_market_kill_requests_quantity_light_weight": 0,
        "kill_house_market_kill_requests_quantity": 0,
        "kill_house_market_kill_requests_quantity_first": 0,
        "kill_house_market_kill_requests_quantity_final": 0,
        "kill_house_today_left_share": 0,
        "light_real_quantity": 0,
        "kill_house_market_kill_requests_quantity_weight": 0,
        "kill_house_market_kill_requests_quantity_first_weight": 0,
        "kill_house_market_kill_requests_quantity_final_weight": 0,
        "total_kill_house_market_kill_requests_quantity_agreement_light_weight": 0,
        "total_kill_house_market_kill_requests_quantity_light_weight": 0,
        "total_kill_house_market_kill_requests_quantity_heavy_weight": 0,
    }

    if not kill_house.market_buying:
        return result

    now = datetime.date.today()
    date_filter = Q(send_date__date=now)
    kill_request_date_filter = Q(recive_date__date=now)

    if date1:
        date_filter = Q(send_date__date__gte=date1, send_date__date__lte=date2)
        kill_request_date_filter = Q(recive_date__date__gte=date1, recive_date__date__lte=date2)

    if weights is None:
        weights = IndexWeightCategory.objects.filter(trash=False)
    light = weights.filter(name='سبک').first()
    heavy = weights.filter(name='سنگین').first()

    poultry_requests = PoultryRequest.objects.filter(
        date_filter,
        state_process='accepted',
        province_state='accepted',
        temporary_trash=False,
        trash=False,
        out=False,
        final_state__in=('pending', 'accepted'),
        market=True,
    )

    poultry_agg = poultry_requests.aggregate(
        total=Sum('quantity'),
        total_light=Sum('quantity', filter=Q(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value)),
        total_remain_light=Sum('remain_quantity',
                               filter=Q(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value)),
    )

    total_poultry_requests_quantity = poultry_agg['total'] or 0
    total_light_quantity = poultry_agg['total_light'] or 0
    total_remain_light_quantity = poultry_agg['total_remain_light'] or 0

    kill_requests = KillRequest.objects.filter(
        kill_request_date_filter,
        trash=False,
        kill_house=kill_house,
        market=True,
        market_state__in=('pending', 'accepted')
    )

    agg = kill_requests.aggregate(
        total_kill_capacity=Sum('kill_capacity'),
        total_weight=Sum(F('kill_capacity') * F('Index_weight')),
        total_first=Sum('kill_capacity', filter=Q(market_final_accept=False)),
        total_first_weight=Sum(F('kill_capacity') * F('Index_weight'), filter=Q(market_final_accept=False)),
        total_final=Sum('kill_capacity', filter=Q(market_final_accept=True)),
        total_final_weight=Sum(F('kill_capacity') * F('Index_weight'), filter=Q(market_final_accept=True)),
        total_agreement_light=Sum('kill_capacity', filter=Q(Index_weight__lt=light.min_value)),
        total_light=Sum('kill_capacity', filter=Q(Index_weight__gte=light.min_value, Index_weight__lt=light.max_value)),
        total_heavy=Sum('kill_capacity',
                        filter=Q(Index_weight__gte=heavy.min_value, Index_weight__lte=heavy.max_value)),
    )

    kill_house_today_share = total_poultry_requests_quantity
    if kill_house.market_buying_limitation:
        if kill_house.market_buying_capacity_percent_status:
            kill_house_today_share = int(kill_house.market_capacity_percent / 100 * total_poultry_requests_quantity)
        else:
            kill_house_today_share = int(kill_house.total_kill_capacity * kill_house.total_kill_capacity_percent / 100)

    light_real_quantity = market_calculate_light_weight(
        kill_house, total_kill_houses, total_poultry_requests_quantity, total_light_quantity
    )
    market_light_share = light_real_quantity if kill_house.market_light_capacity else 0
    kill_house_today_left_share = max(0, kill_house_today_share - (agg['total_kill_capacity'] or 0))

    result.update({
        "total_poultry_requests_quantity": total_poultry_requests_quantity,
        "total_poultry_requests_quantity_light_weight": total_light_quantity,
        "total_remain_poultry_requests_quantity_light_weight": total_remain_light_quantity,
        "kill_house_today_share": kill_house_today_share,
        "market_light_share": market_light_share,
        "kill_house_market_kill_requests_quantity_light_weight": agg['total_light'] or 0,
        "kill_house_market_kill_requests_quantity": agg['total_kill_capacity'] or 0,
        "kill_house_market_kill_requests_quantity_first": agg['total_first'] or 0,
        "kill_house_market_kill_requests_quantity_final": agg['total_final'] or 0,
        "kill_house_today_left_share": kill_house_today_left_share,
        "light_real_quantity": light_real_quantity,
        "kill_house_market_kill_requests_quantity_weight": agg['total_weight'] or 0,
        "kill_house_market_kill_requests_quantity_first_weight": agg['total_first_weight'] or 0,
        "kill_house_market_kill_requests_quantity_final_weight": agg['total_final_weight'] or 0,
        "total_kill_house_market_kill_requests_quantity_agreement_light_weight": agg['total_agreement_light'] or 0,
        "total_kill_house_market_kill_requests_quantity_light_weight": agg['total_light'] or 0,
        "total_kill_house_market_kill_requests_quantity_heavy_weight": agg['total_heavy'] or 0,
    })

    return result


def calculate_governmental_quota(kill_house):
    kill_house_governmental_share = 0
    if kill_house.quota:
        now = datetime.datetime.now().date()

        if kill_house.quota_max_kill_limit:
            kill_house_governmental_share = int((kill_house.governmental_quota / 100) * kill_house.total_kill_capacity)
        elif kill_house.quota_request:
            poultry_requests = PoultryRequest.objects.filter(
                send_date__date=now,
                state_process='accepted',
                province_state='accepted',
                temporary_trash=False,
                trash=False,
                out=False,
                free_sale_in_province=False,
                final_state__in=('pending', 'accepted')
            )
            poultry_requests_quantity = poultry_requests.aggregate(total=Sum('remain_quantity'))['total'] or 0
            kill_house_governmental_share = int((kill_house.governmental_quota / 100) * poultry_requests_quantity)

        else:
            if kill_house.quota_custom:
                kill_house_governmental_share = kill_house.quota_custom_quantity

        province_kill_requests = ProvinceKillRequest.objects.filter(trash=False, temporary_trash=False,
                                                                    killhouse_user=kill_house,
                                                                    return_to_province=False,
                                                                    state__in=('pending', 'accepted'),
                                                                    kill_request__recive_date__date=now)
        kill_house_market_kill_requests = KillRequest.objects.filter(trash=False, recive_date__date=now,
                                                                     kill_house=kill_house, market=True,
                                                                     market_state__in=('pending', 'accepted'))

        province_kill_requests_governmental_quantity = \
            province_kill_requests.filter(province_request__poultry_request__free_sale_in_province=False).aggregate(
                total=Sum('total_killed_quantity'))['total'] or 0
        kill_house_market_kill_requests_governmental_quantity = \
            kill_house_market_kill_requests.filter(poultry_request__free_sale_in_province=False).aggregate(
                total=Sum('kill_capacity'))['total'] or 0
        total_governmental_quantity = province_kill_requests_governmental_quantity + kill_house_market_kill_requests_governmental_quantity

        if total_governmental_quantity < kill_house_governmental_share:
            return 'not_allowed'

    return None


# def check_kill_house_remain_limitation_weight(kill_house):
#     yesterday = datetime.datetime.now() - datetime.timedelta(days=1)
#     today = datetime.datetime.now().date()
#     kill_house_requests = KillHouseRequest.objects.filter(input_warehouse=kill_house,
#                                                           province_request__poultry_request__free_sale_in_province=False,
#                                                           kill_request__recive_date__date=yesterday.date(),
#                                                           ware_house_confirmation=True, trash=False,
#                                                           calculate_status=True, warehouse=True)
#
#     kill_house_allocations = StewardAllocation.objects.filter(
#         kill_house=kill_house, trash=False, calculate_status=True, warehouse=True, system_registration_code=True,
#         receiver_state__in=('pending', 'accepted'), date__date=today, quota='governmental')
#
#     kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house,
#                                                                                quota='governmental',
#                                                                                date__date=today, trash=False,
#                                                                                calculate_status=True, warehouse=True)
#     segmentations = PosSegmentation.objects.filter(kill_house=kill_house, date__date=today, trash=False, warehouse=True,
#                                                    quota='governmental')
#
#     kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))[
#                                      'total'] or 0
#     kill_house_allocations_weight = \
#         kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
#     kill_house_free_sale_bars_weight = kill_house_free_sale_bars.aggregate(total=Sum('real_weight_of_carcasses'))[
#                                            'total'] or 0
#
#     segmentation_weight = \
#         segmentations.aggregate(total=Sum('weight'))[
#             'total'] or 0
#
#     total_input = kill_house_requests_weight
#     total_output = kill_house_allocations_weight + kill_house_free_sale_bars_weight + segmentation_weight
#     total_remain = total_input - total_output
#
#     if total_remain <= 0:
#         return True
#     else:
#         if kill_house.ware_house_remaining_percent_limitation_status:
#             if (total_input * (kill_house.ware_house_remaining_percent_limitation / 100)) > total_remain:
#                 return True
#             else:
#                 return False
#         else:
#             return True
def check_kill_house_remain_limitation_weight(kill_house):
    production_date = (datetime.datetime.now() - datetime.timedelta(days=3)).date()
    kill_house_requests = KillHouseRequest.objects.filter(input_warehouse=kill_house,
                                                          province_request__poultry_request__free_sale_in_province=False,
                                                          kill_request__recive_date__date=production_date,
                                                          ware_house_confirmation=True, trash=False,
                                                          calculate_status=True, warehouse=True)

    kill_house_allocations = StewardAllocation.objects.filter(
        kill_house=kill_house, trash=False, calculate_status=True, warehouse=True, system_registration_code=True,
        receiver_state__in=('pending', 'accepted'), production_date__date=production_date, quota='governmental')

    kill_house_free_sale_bars = KillHouseFreeSaleBarInformation.objects.filter(kill_house=kill_house,
                                                                               quota='governmental',
                                                                               production_date__date=production_date, trash=False,
                                                                               calculate_status=True, warehouse=True)
    segmentations = PosSegmentation.objects.filter(kill_house=kill_house, production_date__date=production_date, trash=False, warehouse=True,
                                                   quota='governmental')

    kill_house_requests_weight = kill_house_requests.aggregate(total=Sum('ware_house_accepted_real_weight'))[
                                     'total'] or 0
    kill_house_allocations_weight = \
        kill_house_allocations.aggregate(total=Sum('real_weight_of_carcasses'))['total'] or 0
    kill_house_free_sale_bars_weight = kill_house_free_sale_bars.aggregate(total=Sum('real_weight_of_carcasses'))[
                                           'total'] or 0

    segmentation_weight = \
        segmentations.aggregate(total=Sum('weight'))[
            'total'] or 0


    archives = WarehouseArchive.objects.filter(kill_house=kill_house,date__date=production_date,quota='governmental', trash=False)

    archives_governmental_weight = \
        archives.aggregate(total=Sum('weight'))[
            'total'] or 0

    total_input = kill_house_requests_weight
    total_output = kill_house_allocations_weight + kill_house_free_sale_bars_weight + segmentation_weight + archives_governmental_weight
    total_remain = total_input - total_output

    if total_remain <= 0:
        return True
    else:
        if kill_house.ware_house_remaining_percent_limitation_status:
            if (total_input * (kill_house.ware_house_remaining_percent_limitation / 100)) > total_remain:
                return True
            else:
                return False
        else:
            return True
