from io import BytesIO from django.db.models import Q from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt from openpyxl import Workbook from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from common.helpers import get_organization_by_user from apps.product import models as product_models from apps.product.web.api.v1.serializers import quota_distribution_serializers as distribution_serializers from apps.warehouse import models as warehouse_models from apps.warehouse.web.api.v1 import serializers as warehouse_serializers from common.helper_excel import create_header, excel_description, create_header_freez, create_value, shamsi_date, \ convert_str_to_date from io import BytesIO from django.db.models import Q from django.http import HttpResponse from django.views.decorators.csrf import csrf_exempt from openpyxl import Workbook from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from apps.product import models as product_models from apps.product.web.api.v1.serializers import quota_distribution_serializers as distribution_serializers from apps.warehouse import models as warehouse_models from apps.warehouse.web.api.v1 import serializers as warehouse_serializers from common.helper_excel import create_header, excel_description, create_header_freez, create_value, shamsi_date, \ convert_str_to_date from common.helpers import get_organization_by_user @api_view(["GET"]) @permission_classes([IsAuthenticated]) @csrf_exempt def warehouse_excel(request): sheet_names = [ 'سهمیه', 'ورودی به انبار', ] output = BytesIO() workbook = Workbook() worksheet = workbook.active workbook.remove(worksheet) for name in sheet_names: sheet_name = name worksheet = workbook.create_sheet(sheet_name) worksheet.sheet_view.rightToLeft = True worksheet.insert_rows(1) if sheet_name == 'سهمیه': product = product_models.QuotaDistribution.objects.all() query = request.query_params organization = get_organization_by_user(request.user) if query.get('param') == 'assigned': product = product.filter( Q(assigned_organization=organization) ).order_by('-modify_date') elif query.get('param') == 'assigner': product = product.filter( Q(assigner_organization=organization) ).order_by('-modify_date') elif query.get('param') == 'all': product = product.filter( Q(assigner_organization=organization) | Q(assigned_organization=organization) ).order_by('-modify_date') ser_data = distribution_serializers.QuotaDistributionSerializer(product, many=True).data excel_options = [ "ردیف", "شناسه توزیع", "شناسه سهمیه", "تاریخ ثبت", "توزیع کننده", "دریافت کننده", "وزن", "وزن توزیع شده", "وزن باقیمانده", "وزن فروش رفته", "مانده انبار", "ورودی به انبار", "توضیحات", ] header_list = [ "وزن", "وزن توزیع شده", "وزن باقیمانده", "وزن فروش رفته", "مانده انبار", "ورودی به انبار", ] create_header(worksheet, header_list, 5, 2, height=20, border_style='thin') excel_description(worksheet, 'B1', f'سهمیه', row2='C3') create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20) l = 6 m = 1 if ser_data: for data in ser_data: list1 = [ m, data['distribution_id'] or '', str(data['quota']['quota_id']) if data.get('quota') and data['quota'].get('quota_id') else '', str(shamsi_date(convert_str_to_date(data['create_date']), in_value=True)) if data.get( 'create_date') else '', data[ 'assigner_organization'].get('organization') or '-', data[ 'assigned_organization'].get('organization') or '-', data.get('weight') or 0, data.get('distributed') or 0, data.get('remaining_weight') or 0, data.get('been_sold') or 0, data.get('warehouse_balance') or 0, data.get('warehouse_entry') or 0, data.get('description') or '-' ] create_value(worksheet, list1, l + 1, 1, m=m) m += 1 l += 1 weight = sum((data['weight'] or 0) for data in ser_data) distributed = sum((data['distributed'] or 0) for data in ser_data) remaining_weight = sum((data['remaining_weight'] or 0) for data in ser_data) been_sold = sum((data['been_sold'] or 0) for data in ser_data) warehouse_balance = sum((data['warehouse_balance'] or 0) for data in ser_data) warehouse_entry = sum((data['warehouse_entry'] or 0) for data in ser_data) value_list = [ weight, distributed, remaining_weight, been_sold, warehouse_balance, warehouse_entry, ] create_value(worksheet, value_list, 3, 5, border_style='thin') list2 = [ 'مجموع==>', '', '', '', '', '', weight, distributed, remaining_weight, been_sold, warehouse_balance, warehouse_entry, '', ] create_value(worksheet, list2, l + 3, 1, color='gray') else: entries = warehouse_models.InventoryEntry.objects.filter( organization=get_organization_by_user(request.user)) ser_data = warehouse_serializers.InventoryEntrySerializer(entries, many=True).data excel_options = [ "ردیف", "تاریخ ورود به انبار", "شماره سهمیه", "وزن", "بارنامه", "محل دریافت", "سند", "سند", "توضیحات", ] header_list = [ "وزن", ] create_header(worksheet, header_list, 5, 2, height=20, border_style='thin') excel_description(worksheet, 'B1', f'ورودی به انبار', row2='C3') create_header_freez(worksheet, excel_options, 1, 6, 7, height=22, width=20) l = 6 m = 1 if ser_data: for data in ser_data: list1 = [ m, data['distribution_id'] or '', str(data['quota']['quota_id']) if data.get('quota') and data['quota'].get('quota_id') else '', str(shamsi_date(convert_str_to_date(data['create_date']), in_value=True)) if data.get( 'create_date') else '', data[ 'assigner_organization'].get('organization') or '-', data[ 'assigned_organization'].get('organization') or '-', data.get('weight') or 0, data.get('distributed') or 0, data.get('remaining_weight') or 0, data.get('been_sold') or 0, data.get('warehouse_balance') or 0, data.get('warehouse_entry') or 0, data.get('description') or '-' ] create_value(worksheet, list1, l + 1, 1, m=m) m += 1 l += 1 weight = sum((data['weight'] or 0) for data in ser_data) distributed = sum((data['distributed'] or 0) for data in ser_data) remaining_weight = sum((data['remaining_weight'] or 0) for data in ser_data) been_sold = sum((data['been_sold'] or 0) for data in ser_data) warehouse_balance = sum((data['warehouse_balance'] or 0) for data in ser_data) warehouse_entry = sum((data['warehouse_entry'] or 0) for data in ser_data) value_list = [ weight, distributed, remaining_weight, been_sold, warehouse_balance, warehouse_entry, ] create_value(worksheet, value_list, 3, 5, border_style='thin') list2 = [ 'مجموع==>', '', '', '', '', '', weight, distributed, remaining_weight, been_sold, warehouse_balance, warehouse_entry, '', ] create_value(worksheet, list2, l + 3, 1, color='gray') workbook.save(output) output.seek(0) response = HttpResponse( content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response[ 'Content-Disposition'] = f'attachment; filename="اختلاف کشتار.xlsx"'.encode( 'utf-8') response.write(output.getvalue()) return response